[{"data":1,"prerenderedAt":1422},["ShallowReactive",2],{"post-\u002Ftr\u002Fphp-8-0-yenilikler":3},{"page":4,"translation":1253,"nav":1267,"related":1396,"random":1412},{"id":5,"title":6,"body":7,"categories":1251,"category":1253,"date":1254,"description":1255,"draft":1256,"extension":1257,"image":1258,"kind":1253,"lang":64,"meta":1259,"navigation":241,"path":1260,"readingTime":313,"seo":1261,"slug":1262,"stem":1263,"tags":1264,"translationKey":1253,"type":1252,"updated":1265,"__hash__":1266},"postsTr\u002Ftr\u002Fphp-8-0-yenilikler.md","Merhaba PHP 8: Modern PHP 8.x Çağı",{"type":8,"value":9,"toc":1241},"minimark",[10,43,46,49,52,57,182,184,189,202,207,210,213,255,259,262,269,317,348,352,355,358,449,491,495,498,559,589,593,599,618,671,701,705,716,774,789,793,796,799,814,818,821,825,832,841,845,856,860,867,896,910,921,941,943,947,950,954,1026,1030,1089,1093,1148,1152,1222,1224,1229,1237],[11,12,13,21],"blockquote",{},[14,15,16,17],"p",{},"💡 ",[18,19,20],"strong",{},"Özet (TL;DR):",[22,23,24,31,37],"ul",{},[25,26,27,30],"li",{},[18,28,29],{},"Tarihsel Önemi:"," 26 Kasım 2020'de yayınlanan PHP 8.0, dilin modernleşme sürecindeki en büyük dönüm noktalarından biridir ve günümüz modern PHP 8.x (8.1, 8.2, 8.3, 8.4+) ekosisteminin temelini atmıştır.",[25,32,33,36],{},[18,34,35],{},"Devrim Niteliğindeki Yenilikler:"," Adlandırılmış Değişkenler (Named Arguments), Attributes (Özellikler), Constructor Property Promotion, Union Types, Match İfadesi, Nullsafe Operatörü ve JIT (Just-In-Time) Derleyicisi.",[25,38,39,42],{},[18,40,41],{},"2026 Güncellemesi:"," PHP 8.1, 8.2, 8.3 ve 8.4 sürümleriyle gelen Enums, Readonly sınıflar, Property Hooks ve Asymmetric Visibility gibi yenilikler, PHP'yi modern ve güçlü bir tip güvenli dile dönüştürmüştür.",[14,44,45],{},"26 Kasım 2020 tarihinde yayınlanan yeni sürümle birlikte PHP 7.4.13 sürümünden stabil PHP 8.0 sürümüne geçmiş olduk. Versiyon değişikliği major olduğu için birçok yenilik ve iyileştirmeyi beraberinde getirdi.",[14,47,48],{},"PHP 7'de çalışan bir kodu PHP 8.0'a aktarmak çok zor olmasa da, daha eski versiyonlardan geçişler için daha fazla düzeltme yapmanız gerekebilir. Zira 8.0 versiyonunda artık yer almayan fonksiyon ve özelliklerin bir bölümü zaten 7.x sürümlerinde de kaldırılmış veya uyarı vermeye başlamıştı.",[50,51],"hr",{},[53,54,56],"h3",{"id":55},"php-80-öne-çıkan-yenilikler-tablosu","PHP 8.0 Öne Çıkan Yenilikler Tablosu",[58,59,60,80],"table",{},[61,62,63],"thead",{},[64,65,66,71,74,77],"tr",{},[67,68,70],"th",{"align":69},"left","Özellik",[67,72,73],{"align":69},"PHP 7.x Öncesi",[67,75,76],{"align":69},"PHP 8.0 ve Sonrası",[67,78,79],{"align":69},"Faydası",[81,82,83,100,124,145,164],"tbody",{},[64,84,85,91,94,97],{},[86,87,88],"td",{"align":69},[18,89,90],{},"Constructor Property Promotion",[86,92,93],{"align":69},"Ayrı sınıf özellikleri + atamalar",[86,95,96],{"align":69},"Tek satırda tanım ve atama",[86,98,99],{"align":69},"Boilerplate kodu azaltır.",[64,101,102,107,115,121],{},[86,103,104],{"align":69},[18,105,106],{},"Match Expression",[86,108,109,110,114],{"align":69},"Hantal ve gevşek ",[111,112,113],"code",{},"switch"," blokları",[86,116,117,118],{"align":69},"Katı tip kontrolü yapan temiz ",[111,119,120],{},"match",[86,122,123],{"align":69},"Hataları önler, değer döner.",[64,125,126,131,137,142],{},[86,127,128],{"align":69},[18,129,130],{},"Nullsafe Operator",[86,132,133,134],{"align":69},"İç içe geçmiş ",[111,135,136],{},"if ($x !== null)",[86,138,139],{"align":69},[111,140,141],{},"$session?->user?->name",[86,143,144],{"align":69},"Null Pointer hatalarını önler.",[64,146,147,152,155,161],{},[86,148,149],{"align":69},[18,150,151],{},"Named Arguments",[86,153,154],{"align":69},"Pozisyona bağlı parametre sırası",[86,156,157,160],{"align":69},[111,158,159],{},"param: $value"," kullanımı",[86,162,163],{"align":69},"Okunabilirliği artırır.",[64,165,166,171,174,179],{},[86,167,168],{"align":69},[18,169,170],{},"Union Types",[86,172,173],{"align":69},"Sadece PHPDoc ile tip belirtimi",[86,175,176],{"align":69},[111,177,178],{},"int|float $number",[86,180,181],{"align":69},"Çalışma zamanı tip güvenliği sağlar.",[50,183],{},[185,186,188],"h2",{"id":187},"php-80-ile-neler-değişti","PHP 8.0 ile Neler Değişti?",[14,190,191,201],{},[192,193,200],"a",{"href":194,"rel":195,"target":199},"https:\u002F\u002Fwww.php.net\u002Freleases\u002F8.0\u002Fen.php",[196,197,198],"nofollow","noopener","noreferrer","_blank","PHP 8.0 sürüm sayfasında"," yer aldığı sırayla öne çıkan yeniliklere bir bakalım:",[203,204,206],"h4",{"id":205},"adlandırılmış-değişkenler-named-arguments","Adlandırılmış Değişkenler (Named Arguments)",[14,208,209],{},"Python'da kullandığımız ve büyük rahatlık sağlayan Adlandırılmış Değişkenler özelliği, artık PHP içinde kullanılabilir.",[14,211,212],{},"Adlandırılmış değişkenler özelliği, fonksiyonlara parametrelerin belirli bir sırayla gönderilmesi zorunluluğunu ortadan kaldırıp adları ile gönderilmesini sağlıyor. Bu durum kodun okunabilirliğini ve anlaşılırlığını artırdığı gibi geliştiricinin işini de çok kolaylaştırıyor.",[214,215,220],"pre",{"className":216,"code":217,"language":218,"meta":219,"style":219},"language-php shiki shiki-themes github-light github-dark","\u002F\u002F Pozisyonlu değişkenler kullanma\narray_fill(0, 100, 50);\n\n\u002F\u002F Adlandırılmış değişkenler kullanma\narray_fill(start_index: 0, num: 100, value: 50);\n","php","",[111,221,222,230,236,243,249],{"__ignoreMap":219},[223,224,227],"span",{"class":225,"line":226},"line",1,[223,228,229],{},"\u002F\u002F Pozisyonlu değişkenler kullanma\n",[223,231,233],{"class":225,"line":232},2,[223,234,235],{},"array_fill(0, 100, 50);\n",[223,237,239],{"class":225,"line":238},3,[223,240,242],{"emptyLinePlaceholder":241},true,"\n",[223,244,246],{"class":225,"line":245},4,[223,247,248],{},"\u002F\u002F Adlandırılmış değişkenler kullanma\n",[223,250,252],{"class":225,"line":251},5,[223,253,254],{},"array_fill(start_index: 0, num: 100, value: 50);\n",[203,256,258],{"id":257},"özellikler-attributes","Özellikler (Attributes)",[14,260,261],{},"Diğer dillerde Ek Açıklamalar (Annotations) olarak da bilinen Özellikler (Attributes), eski tip doc bloklarını ayrıştırmak zorunda kalmadan meta veriler eklemeye izin veriyor.",[14,263,264,265,268],{},"Eskiden PHP sadece string tipinde yorum bloklarına izin veriyordu. PHP topluluğu bu sorunu aşmak için yorumların içinde ",[111,266,267],{},"@route"," gibi pseudo karakterleri kullanarak ayrıştırma yöntemleri geliştirmişti. PHP 8.0 Attribute özelliği ile birlikte bu soruna doğal ve performanslı bir çözüm getirmiş oldu.",[214,270,272],{"className":216,"code":271,"language":218,"meta":219,"style":219},"\u002F\u002F PHP 7.x öncesi (PHPDoc \u002F Annotations)\nclass PostsController\n{\n    \u002F**\n     * @Route(\"\u002Fapi\u002Fposts\u002F{id}\", methods={\"GET\"})\n     *\u002F\n    public function get($id) { \u002F* ... *\u002F }\n}\n",[111,273,274,279,284,289,294,299,305,311],{"__ignoreMap":219},[223,275,276],{"class":225,"line":226},[223,277,278],{},"\u002F\u002F PHP 7.x öncesi (PHPDoc \u002F Annotations)\n",[223,280,281],{"class":225,"line":232},[223,282,283],{},"class PostsController\n",[223,285,286],{"class":225,"line":238},[223,287,288],{},"{\n",[223,290,291],{"class":225,"line":245},[223,292,293],{},"    \u002F**\n",[223,295,296],{"class":225,"line":251},[223,297,298],{},"     * @Route(\"\u002Fapi\u002Fposts\u002F{id}\", methods={\"GET\"})\n",[223,300,302],{"class":225,"line":301},6,[223,303,304],{},"     *\u002F\n",[223,306,308],{"class":225,"line":307},7,[223,309,310],{},"    public function get($id) { \u002F* ... *\u002F }\n",[223,312,314],{"class":225,"line":313},8,[223,315,316],{},"}\n",[214,318,320],{"className":216,"code":319,"language":218,"meta":219,"style":219},"\u002F\u002F PHP 8.0 sonrası (Native Attributes)\nclass PostsController\n{\n    #[Route(\"\u002Fapi\u002Fposts\u002F{id}\", methods: [\"GET\"])]\n    public function get($id) { \u002F* ... *\u002F }\n}\n",[111,321,322,327,331,335,340,344],{"__ignoreMap":219},[223,323,324],{"class":225,"line":226},[223,325,326],{},"\u002F\u002F PHP 8.0 sonrası (Native Attributes)\n",[223,328,329],{"class":225,"line":232},[223,330,283],{},[223,332,333],{"class":225,"line":238},[223,334,288],{},[223,336,337],{"class":225,"line":245},[223,338,339],{},"    #[Route(\"\u002Fapi\u002Fposts\u002F{id}\", methods: [\"GET\"])]\n",[223,341,342],{"class":225,"line":251},[223,343,310],{},[223,345,346],{"class":225,"line":301},[223,347,316],{},[203,349,351],{"id":350},"kurucularda-özellik-tanımları-constructor-property-promotion","Kurucularda Özellik Tanımları (Constructor Property Promotion)",[14,353,354],{},"İşte geliştiricilerin hayatını kolaylaştıracak, hem daha az hem de daha anlaşılır koda olanak sağlayan özelliklerden biri daha. PHP 8.0 ile birlikte sınıf özelliklerini doğrudan kurucu (constructor) parametreleri içerisinde tanımlayıp aynı zamanda erişim belirtecini atayabiliyoruz.",[14,356,357],{},"Eskiden özellik tanımları metod tanımlarının dışında sınıfın en başında yapılır, başlangıç değerinin atanması ise kurucu içerisinde gerçekleştirilirdi. PHP 8.0 bu tanımlamayı kısaltsa da eski yöntemi mecburi kılmıyor.",[214,359,361],{"className":216,"code":360,"language":218,"meta":219,"style":219},"\u002F\u002F PHP 7.x sürümü\nclass Point {\n  public float $x;\n  public float $y;\n  public float $z;\n\n  public function __construct(\n    float $x = 0.0,\n    float $y = 0.0,\n    float $z = 0.0\n  ) {\n    $this->x = $x;\n    $this->y = $y;\n    $this->z = $z;\n  }\n}\n",[111,362,363,368,373,378,383,388,392,397,402,408,414,420,426,432,438,444],{"__ignoreMap":219},[223,364,365],{"class":225,"line":226},[223,366,367],{},"\u002F\u002F PHP 7.x sürümü\n",[223,369,370],{"class":225,"line":232},[223,371,372],{},"class Point {\n",[223,374,375],{"class":225,"line":238},[223,376,377],{},"  public float $x;\n",[223,379,380],{"class":225,"line":245},[223,381,382],{},"  public float $y;\n",[223,384,385],{"class":225,"line":251},[223,386,387],{},"  public float $z;\n",[223,389,390],{"class":225,"line":301},[223,391,242],{"emptyLinePlaceholder":241},[223,393,394],{"class":225,"line":307},[223,395,396],{},"  public function __construct(\n",[223,398,399],{"class":225,"line":313},[223,400,401],{},"    float $x = 0.0,\n",[223,403,405],{"class":225,"line":404},9,[223,406,407],{},"    float $y = 0.0,\n",[223,409,411],{"class":225,"line":410},10,[223,412,413],{},"    float $z = 0.0\n",[223,415,417],{"class":225,"line":416},11,[223,418,419],{},"  ) {\n",[223,421,423],{"class":225,"line":422},12,[223,424,425],{},"    $this->x = $x;\n",[223,427,429],{"class":225,"line":428},13,[223,430,431],{},"    $this->y = $y;\n",[223,433,435],{"class":225,"line":434},14,[223,436,437],{},"    $this->z = $z;\n",[223,439,441],{"class":225,"line":440},15,[223,442,443],{},"  }\n",[223,445,447],{"class":225,"line":446},16,[223,448,316],{},[214,450,452],{"className":216,"code":451,"language":218,"meta":219,"style":219},"\u002F\u002F PHP 8.0 sürümü\nclass Point {\n  public function __construct(\n    public float $x = 0.0,\n    public float $y = 0.0,\n    public float $z = 0.0,\n  ) {}\n}\n",[111,453,454,459,463,467,472,477,482,487],{"__ignoreMap":219},[223,455,456],{"class":225,"line":226},[223,457,458],{},"\u002F\u002F PHP 8.0 sürümü\n",[223,460,461],{"class":225,"line":232},[223,462,372],{},[223,464,465],{"class":225,"line":238},[223,466,396],{},[223,468,469],{"class":225,"line":245},[223,470,471],{},"    public float $x = 0.0,\n",[223,473,474],{"class":225,"line":251},[223,475,476],{},"    public float $y = 0.0,\n",[223,478,479],{"class":225,"line":301},[223,480,481],{},"    public float $z = 0.0,\n",[223,483,484],{"class":225,"line":307},[223,485,486],{},"  ) {}\n",[223,488,489],{"class":225,"line":313},[223,490,316],{},[203,492,494],{"id":493},"birleşik-değişken-tipleri-union-types","Birleşik Değişken Tipleri (Union Types)",[14,496,497],{},"Birden fazla tipe sahip olabilecek değişkenleri sadece PHPDoc yorumları ile değil, çalışma zamanında doğrulanacak doğal birleşik değişken tipi tanımları ile yapabiliyoruz.",[214,499,501],{"className":216,"code":500,"language":218,"meta":219,"style":219},"\u002F\u002F PHP 7.x sürümü\nclass Number {\n  \u002F** @var int|float *\u002F\n  private $number;\n\n  \u002F**\n   * @param float|int $number\n   *\u002F\n  public function __construct($number) {\n    $this->number = $number;\n  }\n}\n",[111,502,503,507,512,517,522,526,531,536,541,546,551,555],{"__ignoreMap":219},[223,504,505],{"class":225,"line":226},[223,506,367],{},[223,508,509],{"class":225,"line":232},[223,510,511],{},"class Number {\n",[223,513,514],{"class":225,"line":238},[223,515,516],{},"  \u002F** @var int|float *\u002F\n",[223,518,519],{"class":225,"line":245},[223,520,521],{},"  private $number;\n",[223,523,524],{"class":225,"line":251},[223,525,242],{"emptyLinePlaceholder":241},[223,527,528],{"class":225,"line":301},[223,529,530],{},"  \u002F**\n",[223,532,533],{"class":225,"line":307},[223,534,535],{},"   * @param float|int $number\n",[223,537,538],{"class":225,"line":313},[223,539,540],{},"   *\u002F\n",[223,542,543],{"class":225,"line":404},[223,544,545],{},"  public function __construct($number) {\n",[223,547,548],{"class":225,"line":410},[223,549,550],{},"    $this->number = $number;\n",[223,552,553],{"class":225,"line":416},[223,554,443],{},[223,556,557],{"class":225,"line":422},[223,558,316],{},[214,560,562],{"className":216,"code":561,"language":218,"meta":219,"style":219},"\u002F\u002F PHP 8.0 sürümü\nclass Number {\n  public function __construct(\n    private int|float $number\n  ) {}\n}\n",[111,563,564,568,572,576,581,585],{"__ignoreMap":219},[223,565,566],{"class":225,"line":226},[223,567,458],{},[223,569,570],{"class":225,"line":232},[223,571,511],{},[223,573,574],{"class":225,"line":238},[223,575,396],{},[223,577,578],{"class":225,"line":245},[223,579,580],{},"    private int|float $number\n",[223,582,583],{"class":225,"line":251},[223,584,486],{},[223,586,587],{"class":225,"line":301},[223,588,316],{},[203,590,592],{"id":591},"match-i̇fadesi-match-expression","Match İfadesi (Match Expression)",[14,594,595,596,598],{},"Match ifadesi, ",[111,597,113],{}," yapısına çok benzer ancak daha temiz ve güçlü alternatifler sunar:",[22,600,601,604,611],{},[25,602,603],{},"Match bir ifadedir; sonucu bir değişkende saklanabilir veya doğrudan döndürülebilir.",[25,605,606,607,610],{},"Match kolları tek satır ifadeleri destekler ve ",[111,608,609],{},"break;"," kullanılması gerekmez.",[25,612,613,614,617],{},"Match katı (strict, ",[111,615,616],{},"===",") tip karşılaştırması yapar.",[214,619,621],{"className":216,"code":620,"language":218,"meta":219,"style":219},"\u002F\u002F switch kullanımı (Gevşek tip karşılaştırması yapar)\nswitch (8.0) {\n  case '8.0':\n    $result = \"Oh no!\";\n    break;\n  case 8.0:\n    $result = \"This is what I expected\";\n    break;\n}\necho $result; \u002F\u002F Çıktı: Oh no!\n",[111,622,623,628,633,638,643,648,653,658,662,666],{"__ignoreMap":219},[223,624,625],{"class":225,"line":226},[223,626,627],{},"\u002F\u002F switch kullanımı (Gevşek tip karşılaştırması yapar)\n",[223,629,630],{"class":225,"line":232},[223,631,632],{},"switch (8.0) {\n",[223,634,635],{"class":225,"line":238},[223,636,637],{},"  case '8.0':\n",[223,639,640],{"class":225,"line":245},[223,641,642],{},"    $result = \"Oh no!\";\n",[223,644,645],{"class":225,"line":251},[223,646,647],{},"    break;\n",[223,649,650],{"class":225,"line":301},[223,651,652],{},"  case 8.0:\n",[223,654,655],{"class":225,"line":307},[223,656,657],{},"    $result = \"This is what I expected\";\n",[223,659,660],{"class":225,"line":313},[223,661,647],{},[223,663,664],{"class":225,"line":404},[223,665,316],{},[223,667,668],{"class":225,"line":410},[223,669,670],{},"echo $result; \u002F\u002F Çıktı: Oh no!\n",[214,672,674],{"className":216,"code":673,"language":218,"meta":219,"style":219},"\u002F\u002F match kullanımı (Katı tip karşılaştırması yapar)\necho match (8.0) {\n  '8.0' => \"Oh no!\",\n  8.0 => \"This is what I expected\",\n}; \u002F\u002F Çıktı: This is what I expected\n",[111,675,676,681,686,691,696],{"__ignoreMap":219},[223,677,678],{"class":225,"line":226},[223,679,680],{},"\u002F\u002F match kullanımı (Katı tip karşılaştırması yapar)\n",[223,682,683],{"class":225,"line":232},[223,684,685],{},"echo match (8.0) {\n",[223,687,688],{"class":225,"line":238},[223,689,690],{},"  '8.0' => \"Oh no!\",\n",[223,692,693],{"class":225,"line":245},[223,694,695],{},"  8.0 => \"This is what I expected\",\n",[223,697,698],{"class":225,"line":251},[223,699,700],{},"}; \u002F\u002F Çıktı: This is what I expected\n",[203,702,704],{"id":703},"nullsafe-operatörü-nullsafe-operator","Nullsafe Operatörü (Nullsafe Operator)",[14,706,707,708,711,712,715],{},"Geliştiricilerin işini çok kolaylaştıracak, gereksiz kod yığınlarını ortadan kaldıracak faydalı bir özellik. Artık null kontrolleri için iç içe ",[111,709,710],{},"if"," koşulları yazmak yerine yeni eklenen Nullsafe operatörünü (",[111,713,714],{},"?->",") kullanabiliyoruz.",[214,717,719],{"className":216,"code":718,"language":218,"meta":219,"style":219},"\u002F\u002F PHP 7.x öncesi\n$country = null;\nif ($session !== null) {\n  $user = $session->user;\n  if ($user !== null) {\n    $address = $user->getAddress();\n    if ($address !== null) {\n      $country = $address->country;\n    }\n  }\n}\n",[111,720,721,726,731,736,741,746,751,756,761,766,770],{"__ignoreMap":219},[223,722,723],{"class":225,"line":226},[223,724,725],{},"\u002F\u002F PHP 7.x öncesi\n",[223,727,728],{"class":225,"line":232},[223,729,730],{},"$country = null;\n",[223,732,733],{"class":225,"line":238},[223,734,735],{},"if ($session !== null) {\n",[223,737,738],{"class":225,"line":245},[223,739,740],{},"  $user = $session->user;\n",[223,742,743],{"class":225,"line":251},[223,744,745],{},"  if ($user !== null) {\n",[223,747,748],{"class":225,"line":301},[223,749,750],{},"    $address = $user->getAddress();\n",[223,752,753],{"class":225,"line":307},[223,754,755],{},"    if ($address !== null) {\n",[223,757,758],{"class":225,"line":313},[223,759,760],{},"      $country = $address->country;\n",[223,762,763],{"class":225,"line":404},[223,764,765],{},"    }\n",[223,767,768],{"class":225,"line":410},[223,769,443],{},[223,771,772],{"class":225,"line":416},[223,773,316],{},[214,775,777],{"className":216,"code":776,"language":218,"meta":219,"style":219},"\u002F\u002F PHP 8.0 nullsafe operator\n$country = $session?->user?->getAddress()?->country;\n",[111,778,779,784],{"__ignoreMap":219},[223,780,781],{"class":225,"line":226},[223,782,783],{},"\u002F\u002F PHP 8.0 nullsafe operator\n",[223,785,786],{"class":225,"line":232},[223,787,788],{},"$country = $session?->user?->getAddress()?->country;\n",[203,790,792],{"id":791},"daha-akıllı-metin-ve-sayı-karşılaştırmaları-saner-string-to-number-comparisons","Daha Akıllı Metin ve Sayı Karşılaştırmaları (Saner String to Number Comparisons)",[14,794,795],{},"Eski sürümlerde metin ve sayı tipinde iki değişken karşılaştırılırken metin tipindeki değişkenin değeri sayıya çevriliyor ve karşılaştırma iki sayı arasında yapılıyordu. Bu durum, metin değişkenin içeriğinin gerçekten sayı olmadığı durumlarda hatalı sonuçlar verebiliyordu.",[14,797,798],{},"PHP 8.0 ile birlikte metin tipli değişkenin içeriği gerçekten sayısal bir değer değilse, sayı tipindeki değişken metin türüne çevrilip metinsel karşılaştırma yapılır.",[214,800,802],{"className":216,"code":801,"language":218,"meta":219,"style":219},"0 == 'foobar' \u002F\u002F PHP 7.x öncesinde true dönerdi\n0 == 'foobar' \u002F\u002F PHP 8.0 sonrasında false döner\n",[111,803,804,809],{"__ignoreMap":219},[223,805,806],{"class":225,"line":226},[223,807,808],{},"0 == 'foobar' \u002F\u002F PHP 7.x öncesinde true dönerdi\n",[223,810,811],{"class":225,"line":232},[223,812,813],{},"0 == 'foobar' \u002F\u002F PHP 8.0 sonrasında false döner\n",[203,815,817],{"id":816},"just-in-time-derlemesi-jit-just-in-time-compilation","Just-In-Time Derlemesi (JIT) (Just-In-Time Compilation)",[14,819,820],{},"PHP 8, Function JIT ve Tracing JIT adında iki JIT derleme motoru sunuyor. Tracing JIT, karşılaştırmalarda yaklaşık 3 kat daha iyi performans gösterirken uzun işlem süreli bazı arka plan uygulamalarında (CPU yoğunluklu işler) 1.5 - 2 kat performans iyileşmesi sağlıyor. Normal web uygulamalarındaki performansı ise PHP 7.4 ile benzer seviyede.",[203,822,824],{"id":823},"mixed-tipi","Mixed Tipi",[14,826,827,828,831],{},"Bazen bir fonksiyonun döndüreceği bir değer veya gönderilecek parametrenin tipi değişkenlik gösterebilir. PHP 8 ile gelen ",[111,829,830],{},"mixed"," tipi; array, bool, callable, int, float, null, object, resource ve string tiplerinin tamamını kapsar.",[214,833,835],{"className":216,"code":834,"language":218,"meta":219,"style":219},"function foo(mixed $bar): mixed {}\n",[111,836,837],{"__ignoreMap":219},[223,838,839],{"class":225,"line":226},[223,840,834],{},[203,842,844],{"id":843},"objeler-üzerinde-class-özelliğinin-kullanımı","Objeler Üzerinde ::class Özelliğinin Kullanımı",[14,846,847,848,851,852,855],{},"Eskiden bir objenin sınıf ismini öğrenmek için ",[111,849,850],{},"get_class()"," metodunu çağırmak zorundaydık. Artık sınıflara ",[111,853,854],{},"$foo::class"," şeklinde doğrudan ulaşabiliyoruz.",[203,857,859],{"id":858},"değişkensiz-hata-ayıklama-non-capturing-catches","Değişkensiz Hata Ayıklama (Non-capturing Catches)",[14,861,862,863,866],{},"Eskiden ",[111,864,865],{},"catch"," bloğu ile hata ayıklama yaparken yakalanan hatayı kullanmasak bile bir değişkene atamamız gerekiyordu. PHP 8.0 ile birlikte bu zorunluluk ortadan kalktı:",[214,868,870],{"className":216,"code":869,"language":218,"meta":219,"style":219},"try {\n    \u002F\u002F Hatalı işlem\n} catch (Exception) {\n    Log::error(\"Something went wrong\");\n}\n",[111,871,872,877,882,887,892],{"__ignoreMap":219},[223,873,874],{"class":225,"line":226},[223,875,876],{},"try {\n",[223,878,879],{"class":225,"line":232},[223,880,881],{},"    \u002F\u002F Hatalı işlem\n",[223,883,884],{"class":225,"line":238},[223,885,886],{},"} catch (Exception) {\n",[223,888,889],{"class":225,"line":245},[223,890,891],{},"    Log::error(\"Something went wrong\");\n",[223,893,894],{"class":225,"line":251},[223,895,316],{},[203,897,899,900,903,904,903,907],{"id":898},"yeni-yardımcı-metotlar-str_contains-str_starts_with-str_ends_with","Yeni Yardımcı Metotlar: ",[111,901,902],{},"str_contains()",", ",[111,905,906],{},"str_starts_with()",[111,908,909],{},"str_ends_with()",[14,911,912,913,916,917,920],{},"Eskiden bir string içerisinde arama yaparken veya başını\u002Fsonunu kontrol ederken ",[111,914,915],{},"strpos"," veya ",[111,918,919],{},"substr"," gibi dolaylı metotlar kullanıyorduk. PHP 8 ile birlikte artık native yardımcı fonksiyonlarımız var:",[214,922,924],{"className":216,"code":923,"language":218,"meta":219,"style":219},"str_contains(\"Modern PHP\", \"PHP\"); \u002F\u002F true\nstr_starts_with(\"Modern PHP\", \"Mod\"); \u002F\u002F true\nstr_ends_with(\"Modern PHP\", \"PHP\"); \u002F\u002F true\n",[111,925,926,931,936],{"__ignoreMap":219},[223,927,928],{"class":225,"line":226},[223,929,930],{},"str_contains(\"Modern PHP\", \"PHP\"); \u002F\u002F true\n",[223,932,933],{"class":225,"line":232},[223,934,935],{},"str_starts_with(\"Modern PHP\", \"Mod\"); \u002F\u002F true\n",[223,937,938],{"class":225,"line":238},[223,939,940],{},"str_ends_with(\"Modern PHP\", \"PHP\"); \u002F\u002F true\n",[50,942],{},[185,944,946],{"id":945},"_2026-güncellemesi-php-81-82-83-ve-84-ile-gelen-modern-özellikler","2026 Güncellemesi: PHP 8.1, 8.2, 8.3 ve 8.4 ile Gelen Modern Özellikler",[14,948,949],{},"PHP 8.0'ın açtığı modernleşme yolculuğu, sonraki minor sürümlerle daha da güçlendi. Günümüz (2026) modern PHP dünyasında en çok kullanılan ve dili tamamen değiştiren yenilikleri kısaca inceleyelim:",[53,951,953],{"id":952},"php-81-yenilikleri","PHP 8.1 Yenilikleri",[22,955,956,991],{},[25,957,958,961,962],{},[18,959,960],{},"Enums (Numaralandırmalar):"," PHP'ye nihayet yerleşik Enum desteği geldi:\n",[214,963,965],{"className":216,"code":964,"language":218,"meta":219,"style":219},"enum Status: string {\n    case Pending = 'pending';\n    case Active = 'active';\n    case Archived = 'archived';\n}\n",[111,966,967,972,977,982,987],{"__ignoreMap":219},[223,968,969],{"class":225,"line":226},[223,970,971],{},"enum Status: string {\n",[223,973,974],{"class":225,"line":232},[223,975,976],{},"    case Pending = 'pending';\n",[223,978,979],{"class":225,"line":238},[223,980,981],{},"    case Active = 'active';\n",[223,983,984],{"class":225,"line":245},[223,985,986],{},"    case Archived = 'archived';\n",[223,988,989],{"class":225,"line":251},[223,990,316],{},[25,992,993,996,997],{},[18,994,995],{},"Readonly Properties:"," Sadece bir kez değer atanabilen ve sonrasında değiştirilemeyen özellikler tanımlamamızı sağlar:\n",[214,998,1000],{"className":216,"code":999,"language":218,"meta":219,"style":219},"class User {\n    public function __construct(\n        public readonly string $username\n    ) {}\n}\n",[111,1001,1002,1007,1012,1017,1022],{"__ignoreMap":219},[223,1003,1004],{"class":225,"line":226},[223,1005,1006],{},"class User {\n",[223,1008,1009],{"class":225,"line":232},[223,1010,1011],{},"    public function __construct(\n",[223,1013,1014],{"class":225,"line":238},[223,1015,1016],{},"        public readonly string $username\n",[223,1018,1019],{"class":225,"line":245},[223,1020,1021],{},"    ) {}\n",[223,1023,1024],{"class":225,"line":251},[223,1025,316],{},[53,1027,1029],{"id":1028},"php-82-yenilikleri","PHP 8.2 Yenilikleri",[22,1031,1032,1074],{},[25,1033,1034,1037,1038,1041,1042],{},[18,1035,1036],{},"Readonly Classes:"," Sınıf içindeki tüm özellikleri otomatik olarak ",[111,1039,1040],{},"readonly"," yapar ve dinamik özellik eklenmesini engeller:\n",[214,1043,1045],{"className":216,"code":1044,"language":218,"meta":219,"style":219},"readonly class Configuration {\n    public function __construct(\n        public string $apiToken,\n        public string $environment\n    ) {}\n}\n",[111,1046,1047,1052,1056,1061,1066,1070],{"__ignoreMap":219},[223,1048,1049],{"class":225,"line":226},[223,1050,1051],{},"readonly class Configuration {\n",[223,1053,1054],{"class":225,"line":232},[223,1055,1011],{},[223,1057,1058],{"class":225,"line":238},[223,1059,1060],{},"        public string $apiToken,\n",[223,1062,1063],{"class":225,"line":245},[223,1064,1065],{},"        public string $environment\n",[223,1067,1068],{"class":225,"line":251},[223,1069,1021],{},[223,1071,1072],{"class":225,"line":301},[223,1073,316],{},[25,1075,1076,1079,1080],{},[18,1077,1078],{},"DNF Types (Disjunctive Normal Form):"," Union (Birlik) ve Intersection (Kesişim) tiplerini bir arada kullanabilmemizi sağlar:\n",[214,1081,1083],{"className":216,"code":1082,"language":218,"meta":219,"style":219},"public function process((HasId & HasName) | null $entity) { \u002F* ... *\u002F }\n",[111,1084,1085],{"__ignoreMap":219},[223,1086,1087],{"class":225,"line":226},[223,1088,1082],{},[53,1090,1092],{"id":1091},"php-83-yenilikleri","PHP 8.3 Yenilikleri",[22,1094,1095,1120],{},[25,1096,1097,1100,1101],{},[18,1098,1099],{},"Typed Class Constants:"," Sınıf sabitlerine tip tanımı ekleyebilme özelliği geldi:\n",[214,1102,1104],{"className":216,"code":1103,"language":218,"meta":219,"style":219},"class APIClient {\n    public const string BASE_URL = 'https:\u002F\u002Fapi.example.com';\n}\n",[111,1105,1106,1111,1116],{"__ignoreMap":219},[223,1107,1108],{"class":225,"line":226},[223,1109,1110],{},"class APIClient {\n",[223,1112,1113],{"class":225,"line":232},[223,1114,1115],{},"    public const string BASE_URL = 'https:\u002F\u002Fapi.example.com';\n",[223,1117,1118],{"class":225,"line":238},[223,1119,316],{},[25,1121,1122,1128,1129],{},[18,1123,1124,1127],{},[111,1125,1126],{},"json_validate()"," Fonksiyonu:"," Bir string'in geçerli bir JSON olup olmadığını belleği yormadan doğrular:\n",[214,1130,1132],{"className":216,"code":1131,"language":218,"meta":219,"style":219},"if (json_validate($jsonString)) {\n    $data = json_decode($jsonString);\n}\n",[111,1133,1134,1139,1144],{"__ignoreMap":219},[223,1135,1136],{"class":225,"line":226},[223,1137,1138],{},"if (json_validate($jsonString)) {\n",[223,1140,1141],{"class":225,"line":232},[223,1142,1143],{},"    $data = json_decode($jsonString);\n",[223,1145,1146],{"class":225,"line":238},[223,1147,316],{},[53,1149,1151],{"id":1150},"php-84-yenilikleri","PHP 8.4 Yenilikleri",[22,1153,1154,1192],{},[25,1155,1156,1159,1160],{},[18,1157,1158],{},"Property Hooks (Özellik Kancaları):"," C# ve Kotlin benzeri, getter ve setter metotlarını doğrudan sınıf özelliği üzerinde tanımlama özelliği geldi:\n",[214,1161,1163],{"className":216,"code":1162,"language":218,"meta":219,"style":219},"class User {\n    public string $name {\n        set => trim($value);\n        get => ucfirst($this->name);\n    }\n}\n",[111,1164,1165,1169,1174,1179,1184,1188],{"__ignoreMap":219},[223,1166,1167],{"class":225,"line":226},[223,1168,1006],{},[223,1170,1171],{"class":225,"line":232},[223,1172,1173],{},"    public string $name {\n",[223,1175,1176],{"class":225,"line":238},[223,1177,1178],{},"        set => trim($value);\n",[223,1180,1181],{"class":225,"line":245},[223,1182,1183],{},"        get => ucfirst($this->name);\n",[223,1185,1186],{"class":225,"line":251},[223,1187,765],{},[223,1189,1190],{"class":225,"line":301},[223,1191,316],{},[25,1193,1194,1197,1198],{},[18,1195,1196],{},"Asymmetric Visibility (Asimetrik Görünürlük):"," Bir özelliğin okunma (get) ve yazılma (set) yetkilerini ayrı ayrı belirleme olanağı sağlandı:\n",[214,1199,1201],{"className":216,"code":1200,"language":218,"meta":219,"style":219},"class Product {\n    \u002F\u002F Dışarıdan okunabilir (public), sadece sınıf içinden değiştirilebilir (private)\n    public private(set) string $sku;\n}\n",[111,1202,1203,1208,1213,1218],{"__ignoreMap":219},[223,1204,1205],{"class":225,"line":226},[223,1206,1207],{},"class Product {\n",[223,1209,1210],{"class":225,"line":232},[223,1211,1212],{},"    \u002F\u002F Dışarıdan okunabilir (public), sadece sınıf içinden değiştirilebilir (private)\n",[223,1214,1215],{"class":225,"line":238},[223,1216,1217],{},"    public private(set) string $sku;\n",[223,1219,1220],{"class":225,"line":245},[223,1221,316],{},[50,1223],{},[1225,1226,1228],"h5",{"id":1227},"bu-yazıda-yapılan-değişiklikler","Bu Yazıda Yapılan Değişiklikler",[22,1230,1231,1234],{},[25,1232,1233],{},"11.05.2022: Yazı özeti düzenlendi.",[25,1235,1236],{},"21.06.2026: Yazı \"Modern PHP 8.x Çağı\" olarak güncellendi, JIT paragrafındaki tekrarlar kaldırıldı, kod renklendirmeleri eklendi, PHP 8.1, 8.2, 8.3 ve 8.4 sürümlerinin getirdiği devrim niteliğindeki modern PHP özellikleri eklendi.",[1238,1239,1240],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":219,"searchDepth":232,"depth":232,"links":1242},[1243,1244,1245],{"id":55,"depth":238,"text":56},{"id":187,"depth":232,"text":188},{"id":945,"depth":232,"text":946,"children":1246},[1247,1248,1249,1250],{"id":952,"depth":238,"text":953},{"id":1028,"depth":238,"text":1029},{"id":1091,"depth":238,"text":1092},{"id":1150,"depth":238,"text":1151},[1252],"technical",null,"2020-12-09","PHP 8.0 ile başlayan modern PHP devrimi: Named Arguments, Attributes, Match, Nullsafe ve PHP 8.1, 8.2, 8.3, 8.4 sürümlerinin getirdiği yenilikler.",false,"md","\u002Fimages\u002Fhero\u002Fphp-8.avif",{},"\u002Ftr\u002Fphp-8-0-yenilikler",{"title":6,"description":1255},"php-8-0-yenilikler","tr\u002Fphp-8-0-yenilikler",[218],"2026-06-21","1IVHzO74F6LU6cMk7f7_lfSVy18HrbFmdfuzcf4OH7A",{"prev":1268,"next":1271,"others":1274,"lucky":1393,"readingTime":313},{"path":1269,"title":1270},"\u002Ftr\u002Fphalcon-frameworkun-gelecegi","Phalcon Framework'ün Geleceği: Bir Devrin Sonu",{"path":1272,"title":1273},"\u002Ftr\u002Fmerhaba-tailwind-css","Merhaba Tailwind CSS",[1275,1278,1281,1284,1287,1290,1293,1296,1299,1302,1305,1308,1311,1314,1317,1320,1323,1326,1329,1332,1335,1338,1341,1344,1345,1348,1351,1354,1357,1360,1363,1366,1369,1372,1375,1378,1381,1384,1387,1390],{"path":1276,"title":1277},"\u002Ftr\u002Ftailwind-css-nerede-kullanilir-tailwind-css-nerede-kullanilmaz","Tailwind CSS Nerede Kullanılır? Tailwind CSS Nerede Kullanılmaz?",{"path":1279,"title":1280},"\u002Ftr\u002Fbridge-tasarim-deseni-nedir","Bridge Tasarım Deseni Nedir?",{"path":1282,"title":1283},"\u002Ftr\u002Fubuntu-guncellemesi-sonrasi-cyberpanele-ulasilamama-sorunlarini-giderme","Ubuntu Güncellemesi Sonrası CyberPanel'e Ulaşılamama Sorunlarını Giderme",{"path":1285,"title":1286},"\u002Ftr\u002Froot-yetkisi-olmayan-kullanici-ssh-baglantisini-ssh-baglantisini-ssh-anahtari-ile-nasil-kurabilir","Root yetkisi olmayan kullanıcı, SSH bağlantısını, SSH anahtarı ile nasıl kurabilir?",{"path":1288,"title":1289},"\u002Ftr\u002Ffactory-method-ve-abstract-factory-farki-nedir","Factory Method ve Abstract Factory Farkı Nedir?",{"path":1291,"title":1292},"\u002Ftr\u002Fwordpress-yonetici-sifresini-wp-cli-kullanarak-sifirlama","WordPress Yönetici Şifresini WP-CLI Kullanarak Sıfırlama",{"path":1294,"title":1295},"\u002Ftr\u002Fdocker-ile-mariadb-kurulumu","Docker ile MariaDB Kurulumu",{"path":1297,"title":1298},"\u002Ftr\u002Fobserver-tasarim-deseni-nedir","Observer Tasarım Deseni Nedir?",{"path":1300,"title":1301},"\u002Ftr\u002Fdecorator-tasarim-deseni-nedir","Decorator Tasarım Deseni Nedir?",{"path":1303,"title":1304},"\u002Ftr\u002Fes12-nedir-ecmascript-2021-nedir","ES12 Nedir? ECMAScript 2021 Nedir?",{"path":1306,"title":1307},"\u002Ftr\u002Fgarbage-collection-ve-golang","Garbage Collection ve Go (Golang)",{"path":1309,"title":1310},"\u002Ftr\u002Fdocker-nedir","Docker Nedir?",{"path":1312,"title":1313},"\u002Ftr\u002Fmerhaba-gluster","Merhaba Gluster: Dağıtık Dosya Sistemi Nedir?",{"path":1315,"title":1316},"\u002Ftr\u002Fes8-nedir-ecmascript-2017-nedir","ES8 Nedir? ECMAScript 2017 Nedir?",{"path":1318,"title":1319},"\u002Ftr\u002Fgo-veri-tipleri-struct","Go Veri Tipleri: Struct",{"path":1321,"title":1322},"\u002Ftr\u002Fekran-filtresi-mavi-isik-filtresi-flux","Gözlere dost, mavi ışığa düşman ekran filtresi f.lux",{"path":1324,"title":1325},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-abstract-factory-nedir","Abstract Factory Tasarım Deseni Nedir?",{"path":1327,"title":1328},"\u002Ftr\u002Frest-api-dokumantasyonu-nasil-yapilir","REST Api Dokümantasyonu Nasıl Oluşturulur?",{"path":1330,"title":1331},"\u002Ftr\u002Fmediator-tasarim-deseni-nedir","Mediator Tasarım Deseni Nedir?",{"path":1333,"title":1334},"\u002Ftr\u002Fadapter-tasarim-deseni-nedir","Adapter Tasarım Deseni Nedir?",{"path":1336,"title":1337},"\u002Ftr\u002Fdocker-ile-litespeed-enterprise-kurulumu","Docker ile LiteSpeed Enterprise Kurulumu",{"path":1339,"title":1340},"\u002Ftr\u002Fubuntu-20-04-uzerinde-cyberpanel-kurulumu","Ubuntu 20.04 üzerinde CyberPanel kurulumu",{"path":1342,"title":1343},"\u002Ftr\u002Fgo-veri-tipleri-string-integer-float-complex-boolean-ve-array","Go Veri Tipleri - String, Integer, Float, Complex, Boolean ve Array",{"path":1272,"title":1273},{"path":1346,"title":1347},"\u002Ftr\u002Ffull-stack-proje-agaci","Full-Stack Proje Yol Haritası ve İçindekiler",{"path":1349,"title":1350},"\u002Ftr\u002Fgo-veri-tipleri-map","Go Veri Tipleri - Map",{"path":1352,"title":1353},"\u002Ftr\u002Fes9-nedir-ecmascript-2018-nedir","ES9 Nedir? ECMAScript 2018 Nedir?",{"path":1355,"title":1356},"\u002Ftr\u002Fes15-nedir-ecmascript-2024-nedir","ES15 nedir? ECMAScript 2024 nedir?",{"path":1358,"title":1359},"\u002Ftr\u002Ftemplate-method-tasarim-deseni-nedir","Template Method Tasarım Deseni Nedir?",{"path":1361,"title":1362},"\u002Ftr\u002Ftricolor-garbage-collection-algoritmasi-nedir","Tricolor Garbage Collection Algoritması Nedir?",{"path":1364,"title":1365},"\u002Ftr\u002Fmerhabadunya","Merhaba Dünya",{"path":1367,"title":1368},"\u002Ftr\u002Fdocker-swarm-nedir","Docker Swarm Nedir?",{"path":1370,"title":1371},"\u002Ftr\u002Fmutable-ve-immutable-kavrami","Mutable ve Immutable Kavramları Nedir?",{"path":1373,"title":1374},"\u002Ftr\u002Fstate-tasarim-deseni-nedir","State Tasarım Deseni Nedir?",{"path":1376,"title":1377},"\u002Ftr\u002Fnext-js-on-bellegi-nasil-yenilenir-on-demand-cache-regeneration","Next.js Önbelleği Nasıl Yenilenir? \"On-Demand Cache Regeneration\"",{"path":1379,"title":1380},"\u002Ftr\u002Fnostalji-ibibik-online","Nostalji: İbibik Online (1998'den Bir Web Macerası)",{"path":1382,"title":1383},"\u002Ftr\u002Fcomposite-tasarim-deseni-nedir","Composite Tasarım Deseni Nedir?",{"path":1385,"title":1386},"\u002Ftr\u002Frest-api-uri-yapisi-nasil-olmali","REST API URI Yapısı Nasıl Olmalı?",{"path":1388,"title":1389},"\u002Ftr\u002Ftasarim-kaliplari-design-patterns-factory-method-nedir","Factory Method Tasarım Deseni Nedir?",{"path":1391,"title":1392},"\u002Ftr\u002Frestful-api-bilesenleri","RESTful API Bileşenleri",{"path":1394,"title":1395},"\u002Ftr\u002Fapi-gateway-nedir","API Gateway Nedir? Ne İşe Yarar?",[1397,1401,1404,1408],{"path":1398,"title":1399,"date":1400},"\u002Ftr\u002Fphp-generator-ve-iterator-farki","PHP'de Generator ve Iterator Arasındaki Temel Farklar","2026-06-20",{"path":1402,"title":1403,"date":1400},"\u002Ftr\u002Fphp-ve-makine-ogrenimi-php-ml-kutuphanesi","PHP ve Makine Öğrenimi: PHP-ML Kütüphanesi ile Pratik Çözümler",{"path":1405,"title":1406,"date":1407},"\u002Ftr\u002Ftemiz-moduler-ve-yeniden-kullanilabilir-php-kodu-yazma-rehberi","PHP'de Temiz, Modüler ve Yeniden Kullanılabilir Kod Yazma Rehberi","2023-01-17",{"path":1409,"title":1410,"date":1411},"\u002Ftr\u002Fearly-return-erken-donus-nedir","Early Return \u002F Erken Dönüş nedir?","2021-09-11",[1413,1417,1418],{"path":1414,"title":1415,"date":1416},"\u002Ftr\u002Fdesign-patterns-tasarim-desenleri-nedir","Design Patterns \u002F Tasarım Desenleri nedir?","2021-07-24",{"path":1388,"title":1389,"date":1416},{"path":1419,"title":1420,"date":1421},"\u002Ftr\u002Ffull-stack-proje-gelistiriyoruz","Full Stack Proje Geliştiriyoruz","2021-02-16",1782142093776]