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.
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 |
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 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.
Örnek 1 - Temel sınıf türü bildirimi
<?php
class C {}
class D extends C {}
// Bu C ile genişletilmiyor.
class E {}
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 I { public function f(); }
class C implements I { public function f() {} }
// Bu I'yi gerçeklemiyor.
class E {}
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(1, 2));
?>
Yukarıdaki örneğin çıktısı:
float(3)
Örnek 4 - Bir nesne döndürmek
<?php
class C {}
function getC(): C {
return new C;
}
var_dump(getC());
?>
Yukarıdaki örneğin çıktısı:
object(C)#1 (0) { }
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 C {}
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 C {}
function f(C $c = null) {
var_dump($c);
}
f(new C);
f(null);
?>Yukarıdaki örneğin çıktısı:
object(C)#1 (0) { } NULL
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ş (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.
null
tek başına bir tür olarak kullanılamaz.
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.
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.
true
tek başına türü mevcut değildir.
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:
int|string|INT
birleşimi bir hatayla sonuçlanır.
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 A as B;
function foo(): A|B {} // izin verilmez ("use" ad çözünürlüğünün bir parçasıdır)
class_alias('X', 'Y');
function foo(): X|Y {} // izin verilir (fazlalık sadece çalışma anında anlaşılır)
?>
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.
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.
Ö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.
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 $a, int $b) {
return $a + $b;
}
var_dump(sum(1, 2));
var_dump(sum(1.5, 2.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 $a, int $b) {
return $a + $b;
}
var_dump(sum(1, 2));
// Değerler tamsayılara zorlanacaktır, sonuç değil: çıktıya bakın!
var_dump(sum(1.5, 2.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(1, 2));
var_dump(sum(1, 2.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
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:
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
vefalse
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
?>
Ö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 $a, int $b) {
return $a + $b;
}
try {
var_dump(sum(1, 2));
var_dump(sum(1.5, 2.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