Gönderen Treehouse blogda :
PHP 7 ile artık Skalar türleri ekledik. Özellikle: int, float, string ve bool.
Skaler tip ipuçları ekleyerek ve katı gereksinimleri etkinleştirerek, daha doğru ve kendi kendini belgeleyen PHP programlarının yazılabileceği umulmaktadır. Ayrıca size kodunuz üzerinde daha fazla kontrol sağlar ve kodun okunmasını kolaylaştırabilir.
Varsayılan olarak, skaler tür bildirimleri katı değildir, bu da orijinal türü tür bildiriminde belirtilen türle eşleşecek şekilde değiştirmeye çalışacakları anlamına gelir. Başka bir deyişle, sayı ile başlayan bir dizeyi kayan nokta gerektiren bir işleve geçirirseniz, sayıyı baştan alır ve diğer her şeyi kaldırır. Bir int gerektiren bir işleve bir float geçirmek, int (1) olacaktır.
Varsayılan olarak PHP, mümkünse yanlış türdeki değerleri beklenen skaler türe çevirecektir. Örneğin, bir dizgeyi bekleyen bir parametre için bir tamsayı verilen bir işlev, dize türünde bir değişken alır.
Kesin türler devre dışı bırakıldı ( eval ):
<?php
function AddIntAndFloat(int $a, float $b) : int
{
return $a + $b;
}
echo AddIntAndFloat(1.4, '2');
/*
* without strict typing, PHP will change float(1.4) to int(1)
* and string('2') to float(2.0) and returns int(3)
*/
Dosya bazında katı modu etkinleştirmek mümkündür. Katı modda, yalnızca tür bildiriminin tam türünün bir değişkeni kabul edilir veya bir TypeError atılır. Bu kuralın tek istisnası, kayan nokta bekleyen bir işleve bir tamsayı verilebilmesidir. Dahili işlevlerden gelen işlev çağrıları, katı_türler bildiriminden etkilenmez.
Katı modu etkinleştirmek için, declare deyimi katı_tür bildirimi ile birlikte kullanılır:
Etkin katı türler ( eval ):
<?php declare(strict_types=1);
function AddIntAndFloat(int $a, float $b): int
{
return (string) $a + $b;
}
echo AddIntAndFloat(1.4,'2');
// Fatal error: Uncaught TypeError: Argument 1 passed to AddIntAndFloat() must be of the type int, float given
echo AddIntAndFloat(1,'2');
// Fatal error: Uncaught TypeError: Argument 2 passed to AddIntAndFloat() must be of the type float, string given
// Integers can be passed as float-points :
echo AddIntAndFloat(1,1);
// Fatal error: Uncaught TypeError: Return value of AddIntAndFloat() must be of the type integer, string returned
Çalışma örneği:
<?php
declare(strict_types=1);
function AddFloats(float $a, float $b) : float
{
return $a+$b;
}
$float = AddFloats(1.5,2.0); // Returns 3.5
function AddFloatsReturnInt(float $a, float $b) : int
{
return (int) $a+$b;
}
$int = AddFloatsReturnInt($float,1.5); // Returns 5
function Say(string $message): void // As in PHP 7.2
{
echo $message;
}
Say('Hello, World!'); // Prints "Hello, World!"
function ArrayToStdClass(array $array): stdClass
{
return (object) $array;
}
$object = ArrayToStdClass(['name' => 'azjezz','age' => 100]); // returns an stdClass
function StdClassToArray(stdClass $object): array
{
return (array) $object;
}
$array = StdClassToArray($object); // Returns array
function ArrayToObject(array $array): object // As of PHP 7.2
{
return new ArrayObject($array);
}
function ObjectToArray(ArrayObject $object): array
{
return $object->getArrayCopy();
}
var_dump( ObjectToArray( ArrayToObject( [1 => 'a' ] ) ) ); // array(1 => 'a');