- Konu sahibi
- #1
strict_types=1, PHP'nin skaler tür bildirimlerinde otomatik tür dönüştürmesini kapatır. Böylece
Ayarı, etkilenmesini istediğiniz PHP dosyasının en başına ekleyin:
Bu örnekte beklenen sonuç, fonksiyonun
Dönüş türlerinde de tür bildirimi denetlenir; ancak fonksiyondan dönen değerin beklenen türe çevrilip çevrilmeyeceği, fonksiyonun tanımlandığı dosyanın tür davranışıyla ilişkilidir. Bu yüzden ortak kullanılan sınıf ve fonksiyon dosyalarında da dönüş türlerini gerçek dönen değerlerle uyumlu tutmak gerekir.
Kararı verirken temel farkı şu şekilde değerlendirebilirsiniz:
Bu davranış, kullanıcı girdisini, JSON verisini veya veritabanından gelen değeri otomatik olarak doğrulanmış kabul etmez. Katı tip kullanırken dış kaynaktan gelen veriyi fonksiyonu çağırmadan önce açıkça doğrulayıp dönüştürün. Örneğin gerçekten tamsayı kabul ediyorsanız, dönüşümü kontrol ederek yapın; hatalı bir değeri sessizce sıfıra çevirmek yerine uygulamanın beklediği hata akışını kullanın.
Ayarı global sanmak: Bir dosyada etkinleştirmek, başka dosyalardaki çağrıları kendiliğinden katı hâle getirmez.
Her türü etkilediğini düşünmek:
Doğrulamayı tür bildirimi sanmak:
int, float, string ve bool parametre bekleyen kullanıcı tanımlı bir fonksiyona uyumsuz bir değer gönderildiğinde değer sessizce dönüştürülmek yerine TypeError oluşur. Bu ayar tüm projeyi veya tüm değişkenleri etkilemez; dosya bazında çalışır.Çalışma biçimi
Ayarı, etkilenmesini istediğiniz PHP dosyasının en başına ekleyin:
Kod:
<?php
declare(strict_types=1);
function toplam(int $a, int $b): int
{
return $a + $b;
}
try {
echo toplam("10", 5);
} catch (TypeError $e) {
echo "Tür hatası: " . $e->getMessage();
}
Bu örnekte beklenen sonuç, fonksiyonun
"10" değerini otomatik olarak 10 sayısına çevirmemesi ve TypeError yakalanmasıdır. strict_types=1 kaldırılırsa, bu çağrı PHP'nin zayıf tür davranışı nedeniyle dönüştürülebilir ve toplam sonucu yazdırılabilir.declare(strict_types=1) bildirimi PHP etiketinden sonra dosyanın ilk ifadesi olmalıdır; önce çıktı veya UTF-8 BOM bulunması hata oluşturabilir. Fonksiyonun parametreleri için katılık, çağrının yapıldığı dosyadaki bildirime göre belirlenir. Bu nedenle bir fonksiyonu tanımlayan dosyada bu satırın bulunması, başka bir dosyadan yapılan her çağrıyı otomatik olarak katı hâle getirmez.Dönüş türlerinde de tür bildirimi denetlenir; ancak fonksiyondan dönen değerin beklenen türe çevrilip çevrilmeyeceği, fonksiyonun tanımlandığı dosyanın tür davranışıyla ilişkilidir. Bu yüzden ortak kullanılan sınıf ve fonksiyon dosyalarında da dönüş türlerini gerçek dönen değerlerle uyumlu tutmak gerekir.
Zayıf ve katı çağrı arasındaki fark
Kararı verirken temel farkı şu şekilde değerlendirebilirsiniz:
| Durum | Zayıf tür davranışı | strict_types=1 |
|---|---|---|
| int parametreye sayısal string | Uygunsa int'e dönüştürülebilir | TypeError oluşur |
| float parametreye int | float'a dönüştürülebilir | int kabul edilir; float tür bildirimi için açık istisnadır |
| string parametreye sayı | String'e dönüştürülebilir | TypeError oluşur |
Bu davranış, kullanıcı girdisini, JSON verisini veya veritabanından gelen değeri otomatik olarak doğrulanmış kabul etmez. Katı tip kullanırken dış kaynaktan gelen veriyi fonksiyonu çağırmadan önce açıkça doğrulayıp dönüştürün. Örneğin gerçekten tamsayı kabul ediyorsanız, dönüşümü kontrol ederek yapın; hatalı bir değeri sessizce sıfıra çevirmek yerine uygulamanın beklediği hata akışını kullanın.
Uygulama adımları
- Tür güvenliği istediğiniz PHP dosyasının en üstüne
declare(strict_types=1);ekleyin. - Kullanıcı tanımlı fonksiyon ve metotların parametrelerine gerçek beklentiyi belirten türleri yazın.
- Fonksiyon içinde dönen değerin dönüş türüyle gerçekten uyumlu olduğunu kontrol edin.
- Testlerde sayısal string, yanlış türde boolean ve boş değer gibi sınır girdileri deneyin.
- Dış kaynaktan gelen verileri fonksiyona vermeden önce açıkça doğrulayın veya kontrollü biçimde dönüştürün.
Sık yapılan hatalar
Ayarı global sanmak: Bir dosyada etkinleştirmek, başka dosyalardaki çağrıları kendiliğinden katı hâle getirmez.
Her türü etkilediğini düşünmek:
strict_types genel değişken tip sistemi değildir; özellikle skaler tür bildirimlerindeki çağrı ve dönüş davranışıyla ilgilidir. Nesnelerin sınıf uyumu veya değişkenin sonradan başka değer alması için tek başına çözüm değildir.Doğrulamayı tür bildirimi sanmak:
string bildirimi bir metnin e-posta, tarih veya güvenli HTML olduğunu kanıtlamaz. Tür kontrolünden sonra alanın kendi kurallarını da doğrulamak gerekir.Kaynaklar
Sık sorulan sorular
strict_types=1 eski kodu otomatik olarak daha güvenli yapar mı?
Hayır. Uyuşmayan türleri erken görünür kılar; fakat mevcut kodun bu hataları yakalayabilmesi, dış veriyi doğrulaması ve uygun hata akışına sahip olması gerekir.Yerleşik PHP fonksiyonları da aynı şekilde etkilenir mi?
Katı dosyadan doğrudan çağrılan yerleşik işlevlerin skaler parametreleri de etkilenebilir; ilgili işlevin tür sözleşmesine bakın. Buna karşılık yerleşik bir işlevin kendi içinden yaptığı callback çağrıları, çağıran dosyanın strict_types kararını aynı biçimde devralmaz. “Yerleşik işlevler tamamen etkilenmez” veya “bütün callback’ler otomatik katıdır” genellemeleri doğru değildir.strict_types kullanırken tür dönüşümü tamamen yasaklanır mı?
Hayır. Kodunuzda açık dönüşüm yapabilirsiniz; örneğin doğrulama sonucunda bilinçli olarak(int) kullanabilirsiniz. Uyumsuz skaler argümanlara uygulanan örtük dönüşüm sınırlanır; float beklentisinin int kabul etmesi gibi belgelenmiş istisnayı unutmayın.