Ders 14 / 14
Dosya Dahil Etme
Bulunamayan bir dosyanın dahil edilmesinin include, require ve include_once ile hangi kanaldan duyulduğu; ardından on dört dersin ölçümünü bir tabloda toplayan kurs kapanışı.
Yayın Güncelleme
Bu derste
- Bulunamayan bir dosyanın include ve require ile hangi kanaldan duyulduğunu ölçer
- include_once ile aynı dosyanın ikinci kez çalıştırılmadığını gözlemler
- Dahil edilen dosyadaki sözdizim hatasının include için de yürütmeyi durdurduğunu gösterir
- Kursun on dört dersini ölçü sınıflarına göre tek tabloda karşılaştırır
İçindekiler
Dosya Yükleme dersi, istekle gelen bir dosyanın false döndüren bir fonksiyona verilmesiyle bitti. Bir betiğin başka bir dosyayı kendi içine çekmesi aynı soruyu başka bir düzenekte sorar: çekilecek dosya yoksa bu hangi kanaldan duyulur? Yanıt, dahil etmenin hangi biçimiyle yapıldığına göre değişir. Ders, çekirdeğin on dördüncü gözlemini ve onun karşıtlarını ölçer; ardından kursun tamamını tek tabloda toplar.
Ölçüm yine kursun çekirdeğindeki kanal.php dosyasını kullanır. Her ders kendi çalışma dizininde koştuğu için dosya burada da birebir verilir.
<?php // kanal.php — bir sorunun hangi kanaldan duyuldugunu siniflandiran yardimcilar // Yakalanan uyarilarin seviye adlari burada birikir; ileti metni tutulmaz. $GLOBALS['duyulan_uyarilar'] = []; set_error_handler(function (int $seviye): bool { $adlar = [E_WARNING => 'E_WARNING', E_NOTICE => 'E_NOTICE', E_DEPRECATED => 'E_DEPRECATED']; $GLOBALS['duyulan_uyarilar'][] = $adlar[$seviye] ?? 'E_' . $seviye; return true; }); // Degeri tipiyle birlikte kisa bir metne cevirir. function yaz(mixed $deger): string { return match (true) { $deger === null => 'null', is_bool($deger) => $deger ? 'true' : 'false', is_array($deger) => 'dizi(' . count($deger) . ')', default => get_debug_type($deger) . ' ' . $deger, }; } // Isi calistirir ve sorunun hangi kanaldan duyuldugunu sirayla sorar: // once firlatma, sonra uyari, sonra false/null donus; hicbiri yoksa sessiz. function dinle(callable $is): array { $GLOBALS['duyulan_uyarilar'] = []; try { $sonuc = $is(); } catch (Throwable $hata) { return ['durdurur', get_class($hata)]; } if ($GLOBALS['duyulan_uyarilar']) { $seviyeler = implode(',', array_unique($GLOBALS['duyulan_uyarilar'])); return ['uyari', $seviyeler . ', sonuc ' . yaz($sonuc)]; } if ($sonuc === false || $sonuc === null) { return ['donus', 'sonuc ' . yaz($sonuc)]; } return ['sessiz', 'sonuc ' . yaz($sonuc)]; } // Kodu ayri bir PHP yurutmesinde calistirir; cikis kodu 255 ise yurutme durmustur. function ayri_yurut(string $kod): array { exec('php -d display_errors=0 -r ' . escapeshellarg($kod) . ' 2>&1', $satirlar, $cikis); $sinif = $cikis === 255 ? 'durdurur' : 'sessiz'; return [$sinif, 'cikti ' . count($satirlar) . ' satir, cikis ' . $cikis]; }
Eksik Dosya include ile Uyarı Verir
İlk betik dört şeyi ölçer: var olmayan bir dosyanın include ile çekilmesi, var olan bir dosyanın include_once ile iki kez çekilmesi ve o dosyanın kaç kez çalıştığı. Var olan dosyayı betik kendisi yazar; böylece ölçüm bir önceki koşumdan kalan dosyaya bağlı olmaz.
<?php // dahil.php — eksik dosya ve include_once hangi kanaldan duyulur require 'kanal.php'; file_put_contents('parca.php', "<?php\n\$GLOBALS['yuklenme'] = (\$GLOBALS['yuklenme'] ?? 0) + 1;\nreturn 7;\n"); $olcumler = [ 'eksik dahil dosyasi' => fn() => include 'yok.php', 'ilk include_once' => fn() => include_once 'parca.php', 'ikinci include_once' => fn() => include_once 'parca.php', ]; foreach ($olcumler as $ad => $olcum) { [$sinif, $kanit] = dinle($olcum); printf("%-24s%-10s%s\n", $ad, $sinif, $kanit); } echo 'parca.php calisma sayisi ', $GLOBALS['yuklenme'], "\n";
eksik dahil dosyasi uyari E_WARNING, sonuc false ilk include_once sessiz sonuc int 7 ikinci include_once sessiz sonuc true parca.php calisma sayisi 1
İlk satır çekirdeğin eksik dahil dosyasi gözlemidir: include bulamadığı dosya için E_WARNING bildirdi, false döndürdü ve yürütme sürdü. Bu uyarı sınıfıdır ve bu dersin ölçü sınıfıdır. IY21. Döndürülen false da vardır, ama sınıfı dinle()’nin sorduğu sıra belirler: uyarı dönüşten önce sorulur. Bu yüzden satır dönüş değil, uyarı yazar.
Sonraki iki satır include_once içindir. İlk çağrı dosyayı çalıştırır ve dosyanın return ettiği 7 değerini verir. İkinci çağrı dosyayı bir daha çalıştırmaz ve yalnız true döndürür; son satır dosyanın toplam bir kez çalıştığını doğrular. IY22. Bu, include_once ile require_once için aynı davranıştır ve aynı fonksiyonun iki kez tanımlanması gibi çakışmaları önler. Ama ikinci çağrının 7 değil true vermesi sessiz bir farktır: dosyanın dönüş değerini kullanan kod, ikinci çağrıda başka bir değer alır.
Require Uyarının Ardından Durdurur
require aynı eksikliği daha sert karşılar. Yürütmeyi sürdürmesi için bir false bırakmaz; dosya bulunamazsa durur. Bunun hangi biçimde olduğu ölçülür, varsayılmaz. İki ölçüm yapılır: aynı işlemde bir try ile ve ayrı bir yürütmede çıkış koduyla.
<?php // zorunlu.php — require ile eksik dosya hangi kanaldan duyulur require 'kanal.php'; [$sinif, $kanit] = dinle(fn() => require 'yok.php'); printf("%-24s%-10s%s\n", 'eksik require', $sinif, $kanit); echo 'once duyulan uyari: ', implode(',', $GLOBALS['duyulan_uyarilar']), "\n"; [$sinif, $kanit] = ayri_yurut('echo "once\n"; require "yok.php"; echo "sonra\n";'); printf("%-24s%-10s%s\n", 'ayri yurutme', $sinif, $kanit);
eksik require durdurur Error once duyulan uyari: E_WARNING ayri yurutme durdurur cikti 1 satir, cikis 255
IY23. Sınıf durdururdur: require bir Throwable fırlattı ve ayrı yürütme 255 koduyla çıktı, sonra satırı basılmadı. Kanal birden fazla sinyal verdi: require önce E_WARNING bildirdi, ardından yürütmeyi kesti. Çekirdeğin sorusu en güçlü kanalı seçer, bu yüzden satırın sınıfı uyarı değil durdurur’dur. Kursun ortak kuralı budur: aynı olayda iki kanal konuşuyorsa ölçü, yürütmeyi kesen kanaldır.
Yol Çalışma Dizinine Mi Bağlı
Göreli bir yol, betiğin kendi dizinine değil, o anki çalışma dizinine bağlı olabilir. Aynı dosya __DIR__ ile verilince bu bağımlılık kalkar. __DIR__, çalışan dosyanın bulunduğu dizinin yoludur; değeri ortama bağlıdır ve bu derste basılmaz, yalnız onunla kurulan yolun çalışıp çalışmadığı basılır.
<?php // yol.php — dahil edilen yolun calisma dizinine baglanip baglanmadigi require 'kanal.php'; file_put_contents('parca.php', "<?php\nreturn 7;\n"); chdir('/'); $olcumler = [ 'goreli ./ yolu' => fn() => include './parca.php', '__DIR__ ile yol' => fn() => include __DIR__ . '/parca.php', ]; foreach ($olcumler as $ad => $olcum) { [$sinif, $kanit] = dinle($olcum); printf("%-24s%-10s%s\n", $ad, $sinif, $kanit); }
goreli ./ yolu uyari E_WARNING, sonuc false __DIR__ ile yol sessiz sonuc int 7
IY24. Çalışma dizini değiştikten sonra ./ ile başlayan yol dosyayı bulamadı ve uyarı verdi; __DIR__ ile kurulan yol bulundu ve dosyanın 7 değeri döndü. Yol dahil edilen dosyanın yerini betiğin konumuna bağlıyorsa __DIR__ kullanılır. Bu, hatanın kanalını değiştirmez; yalnız hatanın çıkma olasılığını azaltır.
Sınırlayıcı Ölçüm
include’un uyarı kanalı bir koşula bağlıdır: dosya bulunamazsa geçerlidir. Dosya bulunur ve sözdizimi bozuksa durum değişir. Aşağıdaki betik bozuk bir dosyayı include ile çeker.
<?php // bozuk.php — bulunan ama sozdizimi bozuk dosyanin include ile duyulusu require 'kanal.php'; file_put_contents('bozuk_parca.php', "<?php\n\$x = ;\n"); [$sinif, $kanit] = dinle(fn() => include 'bozuk_parca.php'); printf("%-24s%-10s%s\n", 'bozuk dahil dosya', $sinif, $kanit);
bozuk dahil dosya durdurur ParseError
IY25. include bu kez ParseError fırlattı ve sınıf durdururdur. Dosyanın bulunması, kanalı uyarıdan durdurura çevirdi. Bu, Sözdizim ve Etiketler dersindeki özetin ölçülmüş biçimidir: dahil edilen dosyadaki sözdizim hatası ana dosya çalıştıktan sonra yakalanabilir bir ParseError olarak fırlar. Sonuç olarak include için “hata yürütmeyi kesmez” cümlesi doğru değildir; doğru cümle “eksik dosya yürütmeyi kesmez”dir.
Özet
- Bulunamayan bir dosya
includeileE_WARNINGbildirir vefalsedöndürür; yürütme sürer. Bu dersin ölçü sınıfı uyarıdır (eksik dahil dosyasi). requireaynı eksiklikte önce uyarı bildirir, sonra yürütmeyi keser; sınıfı durdururdur.include_onceikinci çağrıda dosyayı çalıştırmaz vetruedöndürür; ilk çağrıdaki dönüş değeri kaybolur../ile başlayan yol çalışma dizinine bağlıdır;__DIR__ile kurulan yol betiğin konumuna bağlıdır.- Dosya bulunur ama sözdizimi bozuksa
includedaParseErrorfırlatır ve durdurur.
Kurs Kapanışı
Kurs boyunca tek soru soruldu: bu sorun hangi kanaldan duyuluyor? On dört ders, her biri bir düzeneği ölçtü ve her biri kendi sınıfını bu dört addan biriyle adlandırdı. Tablo, her satırda dersin ölçtüğü düzeneği, kanalını ve o kanalın bittiği yeri gösterir.
| Ders | Ölçülen düzenek | Kanal | Sınırlayıcı ölçüm |
|---|---|---|---|
| Yürütme Modeli | on dört gözlemli çekirdek | durdurur | sunucuda her istek baştan başlar |
| Sözdizim ve Etiketler | ayrıştırma ile yürütme hatası | durdurur | sözdizim hatası yürütmeyi başlamadan keser |
| Değişkenler ve Veri Tipleri | tip değere bağlı | sessiz | strict_types çağıranın dosyasını bağlar |
| İşleçler | sayı önekli dizgi | uyarı | ?? uyarıyı susturur |
| Denetim Akışı | karşılıksız match |
durdurur | default kolu durdurmayı sessize çevirir |
| Fonksiyonlar | fazla argüman | sessiz | yerleşik fonksiyon ArgumentCountError verir |
| İndeksli ve İlişkisel Diziler | anahtar normalleşmesi | sessiz | ondalık anahtar E_DEPRECATED verir |
| Çok Boyutlu Diziler | eksik iç anahtar | uyarı | ?? yolun tamamını sessize çevirir |
| Dizi Fonksiyonları | array_search bulamaz |
dönüş | 0 gevşek karşılaştırmada false olur |
| Dizgi İşleme | bozuk JSON | dönüş | JSON_THROW_ON_ERROR durdurur |
| Süper Küresel Değişkenler | eksik sorgu anahtarı | uyarı | dizi gelince TypeError, durum kodu değişir |
| Form İşleme | geçersiz form sayısı | dönüş | geçerli 0 başarısızlıkla aynı görünür |
| Dosya Yükleme | yüklenmemiş dosya | dönüş | post_max_size aşımı iki diziyi de boşaltır |
| Dosya Dahil Etme | eksik dahil dosya | uyarı | bozuk sözdizimi ParseError verir |
On dört dersin dağılımı 3 sessiz · 4 dönüş · 4 uyarı · 3 durdurur’dur; çekirdek her ders için bir gözlem taşıdığından çekirdeğin dağılımı da aynıdır. Dört sınıf aynı aksaklığın dört farklı bedelidir. Sessiz sınıfta bedeli yanlış sonuç öder, dönüşte çağıranın dikkati, uyarıda bildirimi okuyan göz, durdurur sınıfında ise çalışan yürütme.
Tablonun ikinci bir okuması vardır: her satırın son sütunu, o kanalın bir koşula bağlı olduğunu gösterir. ?? uyarıyı sessize çevirir, JSON_THROW_ON_ERROR dönüşü durdurur sınıfına taşır, default kolu durdurmayı sessize çevirir. Kanal, düzeneğin sabit bir özelliği değil, çağıranın yazdığı koda göre kayan bir özelliğidir. Bu nedenle kanalı varsaymak yerine her yeni düzenekte aynı soru sorulur.
Kurs bu soruyla PHP’nin sorunlarını duyma biçimlerini ayırdı; sınıflandırmaların güvenlik sonuçları M24 ve M25’in konusudur. Sıradaki kurs PHP’de sınıfları, arayüzleri ve ad alanlarını ele alır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.