Aylık Arşiv: Nisan 2015

PHP 7 ile Gelen Return Type Declarations

Ekim 2015’te stabil olarak yayınlanması beklenen PHP 7’nin code base’ine return type declarations (geri dönüş bildirimi) merge edildi.

Fonksiyonların yorum satırlarına @return int, @return void yazarak o fonksiyonun hangi tipte veri döndürdüğü belirtilirdi. Ancak bunlar birer yorum satırı olduğu için @return array yazan bir fonksiyondan string dönebiliyordu.

Artık PHP 7 ile doğrudan bir fonksiyonun ne tip veri döndürdüğünü dilin kendisinin de anlayabileceği şekilde belirtebiliyoruz.

Hızlıca bir örnek vermek gerekirse:

function getCity(): string {
    return "Ankara";
}

Örnekte olduğu gibi fonksiyon isminden sonra dönecek olan tipi belirtiyoruz.

Peki bu fonksiyonu şöyle değiştirsek:

function getCity(): string {
    return 06;
}

String döneceğini belirttiğimiz fonksiyon integer bir değer döndürdü.

Sizce bu şekilde çalışacak mı?

İlginç gelebilir ancak çalışacaktır. Çünkü PHP 7 ile artık hayatımıza “weak mode” ve “strict mode” kavramları giriyor.

Tahmin edeceğiniz gibi weak mode bu tarz işlere izin veriyor. Strict mode ise kesinlikle belirtilen kurallara uyulmalı diyor.

Strict mode’u nasıl aktifleştireceğiz?

Kodunuzun <?php satırından hemen sonra

declare(strict_types=1);

yazmanız yeterli. Bu satırı eklemezseniz kodlarınız weak mode’da çalışacaktır.

Şimdi kodu şu şekilde düzenleyip çalıştırmayı deneyelim:

declare(strict_types=1);

function getCity(): string {
    return 06;
}

echo "Merhaba";

Uppss… E yine çalıştı? Yani ekrana Merhaba yazıldı. Ama kodun içinde yerinde bulunan fonksiyon string dönmesi gerekirken integer dönüyor hem de strict mode’dayken!

Neden böyle oldu?

Çünkü getCity() fonksiyonundan dönen değeri henüz bir yerde kullanmadık. Bir başka deyişle getCity() fonksiyonunu henüz çağırmadık.

Yani kodu şöyle düzeltirsek:

declare(strict_types=1);

function getCity(): string {
    return 06;
}

echo "Merhaba";

getCity();

Böyle bir hata alacaksınız:

Fatal error: Return value of getCity() must be of the type string, integer returned in test.php on line 6 in test.php on line 6

Bir Sınıfı Return Type Olarak Belirtmek


declare(strict_types=1);

class Car {
    public $type = "Manual";
}

class Mercedes extends Car {

    public $model = "CLA200";
    public $color = "White";
    public $type = "Automatic";

}

class Property {

    public function getCarDetails(): Car {
        return new Mercedes();
    }

}

$property = new Property();
echo $property->getCarDetails()->type;

getCarDetails() metotunda Car sınıfından bir şey döneceğini belirttik. Mercedes sınıfı da Car sınıfından extend edildiği için çalıştı. Aynı şekilde bir interface‘i de return type olarak belirtebilirsiniz.

Null Bir Şeyler Return Edebiliyor Muyuz?

function getCity(): string {
    return null;
}

getCity();

Bu kodu çalıştırdığınızda şöyle bir hata alacaksınız:

Fatal error: Return value of getCity() must be of the type string, null returned in test.php on line 6 in test.php on line 6

Dikkat ederseniz bu kod strict mode’da dahi değil.

Yapıcı ve Yıkıcı Metotlarda Return Type

__construct, __destruct ve __clone metotlarında return type belirtilemiyor.

Void Return Type Nerelerde?

Void return type henüz yok. Gelişimini şuradan takip edebilirsiniz: https://wiki.php.net/rfc/void_return_type

Not: Yazının başında da belirttiğim gibi PHP 7’nin Ekim 2015’te stabil olması bekleniyor. O zamana kadar return type işlerinde yeni şeyler olabilir (void type gelmesi gibi). Eğer yeni bir şey olursa eklemeye çalışacağım.

 
232 Kudos
Don't move