Tür Bildirimleri

Tür bildirimleri işlev değiştirgelerine, dönüş değerlerine ve PHP 7.4.0'dan itibaren sınıf özelliklerine eklenebilir. Değerin çağrı sırasında belirtilen türde olmasını sağlarlar, aksi takdirde bir TypeError oluşur.

Bilginize:

Bir ebeveyn yöntemi geçersiz kılarken, çocuğun yöntemi ebeveynin herhangi bir dönüş türü bildirimiyle eşleşmelidir. Ebeveyn bir dönüş türü tanımlamıyorsa, çocuk yöntem bunu yapabilir.

Tekil türler

Tür Açıklama Sürüm:
Sınıf/Arayüz Adı Değer, verilen sınıfın veya arabirimin bir örneği olmalıdır.  
self Değer, tür bildiriminin yapıldığı sınıftan örneklenmiş olmalıdır. Sadece sınıflarda kullanılabilir.  
parent Değer, tür bildiriminin yapıldığı sınıfın ebeveyninden örneklenmiş olmalıdır. Sadece sınıflarda kullanılabilir.  
array Değer array türünde olmalıdır.  
callable Değer callable türünde ve geçerli olmalıdır. Bir sınıf özelliğinin tür bildirimi kullanılamaz.  
bool Değer mantıksal bir değer olmalıdır.  
float Değer kayan noktalı bir sayı olmalıdır.  
int Değer bir tamsayı olmalıdır.  
string Değer string türünde olmalıdır.  
iterable Değer Traversable sınıfının bir örneğı veya dizisi olmalıdır. PHP 7.1.0
object Değer object türünde olmalıdır. PHP 7.2.0
mixed Değer, herhangi bir değer olabilir. PHP 8.0.0
Uyarı

Yukarıdaki, sayılarla ifade edilebilen türler için takma adlar desteklenmez. Yapıldığı takdirde bunlar sınıf veya arayüz isimleri olarak değerlendirilir. Örneğin, tür bildirimi olarak boolean kullanmak, bool türünde bir değer yerine, boolean sınıfının veya arayüzünün örneği olan bir değer gerektirir:

<?php
    
function test(boolean $param) {}
    
test(true);
?>

Yukarıdaki örneğin PHP 8 çıktısı:

Warning: "boolean" will be interpreted as a class name. Did you mean "bool"? Write "\boolean" to suppress this warning in /in/9YrUX on line 2

Fatal error: Uncaught TypeError: test(): Argument #1 ($param) must be of type boolean, bool given, called in - on line 3 and defined in -:2
Stack trace:
#0 -(3): test(true)
#1 {main}
  thrown in - on line 2

mixed

mixed türü array|bool|callable |int|float|object |resource|string|null birlik türüne eşdeğerdir. PHP 8.0.0 ve sonrasında kullanılabilir.

Örnekler

Örnek 1 - Temel sınıf türü bildirimi

<?php
class {}
class 
extends {}

// Bu C ile genişletilmiyor.
class {}

function 
f(C $c) {
    echo 
get_class($c)."\n";
}

f(new C);
f(new D);
f(new E);
?>

Yukarıdaki örneğin PHP 8 çıktısı:

C
D

Fatal error: Uncaught TypeError: f(): Argument #1 ($c) must be of type C, E given, called in /in/gLonb on line 14 and defined in /in/gLonb:8
Stack trace:
#0 -(14): f(Object(E))
#1 {main}
  thrown in - on line 8

Örnek 2 - Temel arayüz türü bildirimi

<?php
interface { public function f(); }
class 
implements { public function f() {} }

// Bu I'yi gerçeklemiyor.
class {}

function 
f(I $i) {
    echo 
get_class($i)."\n";
}

f(new C);
f(new E);
?>

Yukarıdaki örneğin PHP 8 çıktısı:

C

Fatal error: Uncaught TypeError: f(): Argument #1 ($i) must be of type I, E given, called in - on line 13 and defined in -:8
Stack trace:
#0 -(13): f(Object(E))
#1 {main}
  thrown in - on line 8

Örnek 3 - Temel dönüş türü bildirimi

<?php
function sum($a$b): float {
    return 
$a $b;
}

// Dikkat bu bir float döndürmeyecek.
var_dump(sum(12));
?>

Yukarıdaki örneğin çıktısı:

float(3)

Örnek 4 - Bir nesne döndürmek

<?php
class {}

function 
getC(): {
    return new 
C;
}

var_dump(getC());
?>

Yukarıdaki örneğin çıktısı:

object(C)#1 (0) {
}

Boş olabilen türler

PHP 7.1.0 ve sonrasında, tür isminin önüne bir soru imi (?) konarak, tür bildirimleri boş olabilir (nullable) olarak imlenebilmektedir. Bu sözdizimi, değerin belirtilen türde veya null olabileceğini belirtir.

Örnek 5 - Boş olabilen değiştirge türü bildirimi

<?php
class {}

function 
f(?C $c) {
    
var_dump($c);
}

f(new C);
f(null);
?>

Yukarıdaki örneğin çıktısı:

object(C)#1 (0) {
}
NULL

Örnek 6 - Boş olabilen dönüş türü bildirimi

<?php
function get_item(): ?string {
    if (isset(
$_GET['item'])) {
        return 
$_GET['item'];
    } else {
        return 
null;
    }
}
?>

Bilginize:

PHP 7.1.0 öncesinde, null'u öntanımlı değer yaparak boş olabilen değiştirgeler elde etmek mümkündü. Kalıtım sırasında kesildiği için bu önerilmez.

Örnek 7 - Boş olabilen değiştirge yapmanın eski yolu

<?php
class {}

function 
f(C $c null) {
    
var_dump($c);
}

f(new C);
f(null);
?>

Yukarıdaki örneğin çıktısı:

object(C)#1 (0) {
}
NULL

Birleşim türleri

Bir birleşim (union) türü bildirimi, tek bir tür yerine birden fazla türde değer kabul eder. Birleşim türleri T1|T2|... sözdizimi kullanılarak belirtilir. Birleşim türleri PHP 8.0.0 ve sonrasında kullanılabilir.

Boş olabilen birleşim türleri

Boş (null) tür, birleşimlerin bir parçası olarak desteklenir, öyle ki T1|T2|null sözdizimi, boş olabilen bir birleşim oluşturmak için kullanılabilir. Mevcut ?T gösterimi, yaygın T|null durumu için bir kısaltma olarak kabul edilir.

Dikkat

null tek başına bir tür olarak kullanılamaz.

false sözde türü

false değişmez türü, birleşimlerin bir parçası olarak desteklenir ve tarihsel nedenlerden ötürü, birçok dahili işlev başarısızlık durumunda null yerine false döndürür. Böyle bir işleve klasik bir örnek strpos()'dur.

Dikkat

false tek başına bir tür olarak kullanılamaz (boş olabilen tür dahil). Bu nedenle, false, false|null ve ?false ifadelerinin hiçbirine izin verilmez.

Dikkat

true tek başına türü mevcut değildir.

Yinelenen ve artık türler

Birleşim türü bildirimlerindeki basit hataları yakalamak için, sınıf yüklemesi gerçekleştirilmeden algılanabilen artık türler bir derleme anı hatasıyla sonuçlanacaktır. Şunları içerir:

  • Ad-çözümlemeli her tür yalnızca bir kere görünebilir. Örneğin, int|string|INT birleşimi bir hatayla sonuçlanır.
  • Eğer bool kullanılmışsa, yanına false eklenemez.
  • Eğer object kullanılmışsa, yanına sınıf türleri eklenemez.
  • Eğer iterable kullanılmışsa, yanına array ve Traversable eklenemez.

Bilginize: Bu, türün "en düşükte" olduğunu garanti etmez, çünkü bunu yapmak tüm kullanılan sınıf türlerinin yüklenmesini gerektirecektir.

Örneğin, A ve B sınıfın diğer adları ise, A|B sonradan A veya B'ye indirgense bile meşru bir birleşim türü olarak kalır. Benzer şekilde, B sınıfı A'yı genişletirse, A|B de meşru bir birleşim türüdür, ancak sadece A'ya indirgenebilir.

<?php
function foo(): int|INT {} // izin verilmez
function foo(): bool|false {} // izin verilmez

use as B;
function 
foo(): A|{} // izin verilmez ("use" ad çözünürlüğünün bir parçasıdır)

class_alias('X''Y');
function 
foo(): X|{} // izin verilir (fazlalık sadece çalışma anında anlaşılır)
?>

Dönüşe özgü türler

void

void işlevin bir değer döndürmediğini belirten bir dönüş türüdür. Bundan dolayı birleşim türündeki bildirimlerde yer alamaz. PHP 7.1.0 ve sonrasında geçerlidir.

static

Değer, yöntemin çağrıldığı sınıf örneğinin örneklendiği sınıfın bir örneği olmalıdır. PHP 8.0.0 ve sonrasında geçerlidir.

Katı kodlama

Öntanımlı olarak, PHP, eğer mümkünse, yanlış türdeki değerleri beklenen sayıl tür bildirimine zorlar. Örneğin, string türünde bir değer alması beklenen bir değiştirge için int değer verilen bir işlev için değer string türüne zorlanır.

Katı kipi dosya bazında etkinleştirmek mümkündür. Katı kipte, yalnızca tür bildirimine tam olarak karşılık gelen bir değer kabul edilir, aksi takdirde bir TypeError istisnası oluşur. Bu kuralın tek istisnası, bir int değerinin bir float tür bildirimine aktarılmasıdır.

Uyarı

Dahili işlevlerden gelen işlev çağrıları, strict_types bildiriminden etkilenmeyecektir.

Katı modu etkinleştirmek için, declare deyimi strict_types bildirimi ile birlikte kullanılır.

Bilginize:

Katı kodlama, katı kodlama etkinleştirilmiş dosya içinden yapılan işlev çağrıları için geçerlidir, o dosya içinde bildirilen işlevler için geçerli değildir. Katı-kodlama-etkin bir dosyada tanımlanan bir işleve, katı-kodlama-etkin-olmayan bir dosyadan çağrı yapılırsa, çağrıcının tercihine (zorlayıcı kodlamaya) saygı gösterilecek ve değer zorlanacaktır.

Bilginize:

Katı kodlama sadece sayıl tür bildirimleri için tanımlanır.

Örnek 8 - Değiştirge değerleri için katı kodlama

<?php
declare(strict_types=1);

function 
sum(int $aint $b) {
    return 
$a $b;
}

var_dump(sum(12));
var_dump(sum(1.52.5));
?>

Yukarıdaki örneğin PHP 8 çıktısı:

int(3)

Fatal error: Uncaught TypeError: sum(): Argument #1 ($a) must be of type int, float given, called in - on line 9 and defined in -:4
Stack trace:
#0 -(9): sum(1.5, 2.5)
#1 {main}
  thrown in - on line 4

Örnek 9 - Değiştirge değerleri için zorlayıcı kodlama

<?php
function sum(int $aint $b) {
    return 
$a $b;
}

var_dump(sum(12));

// Değerler tamsayılara zorlanacaktır, sonuç değil: çıktıya bakın!
var_dump(sum(1.52.5));
?>

Yukarıdaki örneğin çıktısı:

int(3)
int(3)

Örnek 10 - Dönüş değerleri için katı kodlama

<?php
declare(strict_types=1);

function 
sum($a$b): int {
    return 
$a $b;
}

var_dump(sum(12));
var_dump(sum(12.5));
?>

Yukarıdaki örneğin çıktısı:

int(3)

Fatal error: Uncaught TypeError: sum(): Return value must be of type int, float returned in -:5
Stack trace:
#0 -(9): sum(1, 2.5)
#1 {main}
  thrown in - on line 5

Birleşim türleriyle zorlayıcı kodlama

Katı kodlama etkinleştirilmediğinde, sayıl tür bildirimleri sınırlı örtük tür zorlamalarına tabidir. Değerin tam türü birleşimin parçası değilse, hedef tür aşağıdaki tercih sırasına göre seçilir:

  1. int
  2. float
  3. string
  4. bool
Tür birleşiminde her ikisi de mevcutsa ve değer PHP'nin mevcut tür denetleme yapısıyla bir türe zorlanabiliyorsa, o tür seçilir. Aksi takdirde bir sonraki tür denenir.

Dikkat

Bir istisna olarak, değer bir dizeyse ve hem int hem de float birleşimin parçasıysa, tercih edilen tür, mevcut "sayısal dize" çözümlemesine göre belirlenir. Örneğin, "42" için int, "42.0" için float seçilir.

Bilginize:

Yukarıdaki tercih listesinin parçası olmayan türler, örtük zorlama için uygun hedefler değildir. Özellikle, null ve false türlere hiçbir örtük zorlama yapılmaz.

Örnek 11 - Birleşimin bir tür parçasına zorlanan türlere örnek

<?php
// int|string
42    --> 42          // doğru tür
"42"  --> "42"        // doğru tür
new ObjectWithToString --> "Result of __toString()"
                      
// nesne int ile hiç uyumlu değil, dizeye dönülür
42.0  --> 42          // float, int ile uyumlu
42.1  --> 42          // float, int ile uyumlu
1e100 --> "1.0E+100"  // float, int için çok büyük, dizeye dönülür
INF   --> "INF"       // float, int için çok büyük, dizeye dönülür
true  --> 1           // bool, int ile uyumlu
[]    --> TypeError   // array, int veya string ile uyumlu değil

// int|float|bool
"45"    --> 45        // int sayısal dize
"45.0"  --> 45.0      // float sayısal dize

"45X"   --> true      // sayısal dize değil, bool'a dönülür
""      --> false     // sayısal dize değil, bool'a dönülür
"X"     --> true      // sayısal dize değil, bool'a dönülür
[]      --> TypeError // array, int float veya bool ile uyumlu değil
?>

Çeşitli

Örnek 12 Başvuruyla aktarılan değiştirgeler

Bildirilen başvuru değiştirgelerinin türleri işlev girişinde denetlenir, ancak işlev döndüğünde denetlenmez, bu nedenle işlev döndükten sonra değiştirgenin türü değişmiş olabilir.

<?php
function array_baz(array &$param)
{
    
$param 1;
}
$var = [];
array_baz($var);
var_dump($var);
array_baz($var);
?>

Yukarıdaki örneğin PHP 8 çıktısı:

int(1)

Fatal error: Uncaught TypeError: array_baz(): Argument #1 ($param) must be of type array, int given, called in - on line 9 and defined in -:2
Stack trace:
#0 -(9): array_baz(1)
#1 {main}
  thrown in - on line 2

Örnek 13 - TypeError yakalama

<?php
declare(strict_types=1);

function 
sum(int $aint $b) {
    return 
$a $b;
}

try {
    
var_dump(sum(12));
    
var_dump(sum(1.52.5));
} catch (
TypeError $e) {
    echo 
'Error: '$e->getMessage();
}
?>

Yukarıdaki örneğin PHP 8 çıktısı:

int(3)
Error: sum(): Argument #1 ($a) must be of type int, float given, called in - on line 10
add a note add a note

User Contributed Notes 1 note

up
2
anisgazig at example dot com
3 years ago
same data type and same value but first function declare as a argument type declaration and return int(7)
and second fucntion declare as a return type declaration but return int(8).

function argument_type_declaration(int $a, int $b){
    return $a+$b;
}

var_dump(argument_type_declaration(3.5,4.7));
//output:int(7)

function return_type_declaration($a,$b) :int{
    return $a+$b;
}

var_dump(return_type_declaration(3.5,4.7));

//output:int(8)
To Top