Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
strict_types=1, PHP'nin skaler tür bildirimlerinde otomatik tür dönüştürmesini kapatır. Böylece 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:

DurumZayıf tür davranışıstrict_types=1
int parametreye sayısal stringUygunsa int'e dönüştürülebilirTypeError oluşur
float parametreye intfloat'a dönüştürülebilirint kabul edilir; float tür bildirimi için açık istisnadır
string parametreye sayıString'e dönüştürülebilirTypeError 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ı​


  1. Tür güvenliği istediğiniz PHP dosyasının en üstüne declare(strict_types=1); ekleyin.
  2. Kullanıcı tanımlı fonksiyon ve metotların parametrelerine gerçek beklentiyi belirten türleri yazın.
  3. Fonksiyon içinde dönen değerin dönüş türüyle gerçekten uyumlu olduğunu kontrol edin.
  4. Testlerde sayısal string, yanlış türde boolean ve boş değer gibi sınır girdileri deneyin.
  5. 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.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.