Tür bildirimleri işlev bağımsız değişkenlerine, dönüş değerlerine ve PHP 7.4.0 ve sonrasında sınıf özelliklerine eklenebilir. Çağrı sırasında değerin belirtilen türde olmasını gerektirir, aksi takdirde TypeError oluşur.
resource türü dışında PHP'nin desteklediği her tür, kullanıcı bildirimi olarak kullanılabilir. Bu sayfa, farklı türlerin kullanılabilirliğine ilişkin bir değişiklik günlüğü ve bunların tür bildirimlerinde kullanımına ilişkin belgeleri içerir.
Bilginize:
Bir sınıf, bir arayüz yöntemini gerçeklediğinde veya bir üst sınıf tarafından zaten tanımlanmış bir yöntemi yeniden gerçeklediğinde, gerçeklediği tanımla uyumlu olması gerekir. Bir yöntem, özgüllük kurallarına uyuyorsa uyumludur.
Sürüm: | Açıklama |
---|---|
8.3.0 | Sınıf, arayüz, nitelik ve sayılama sabit türleri için destek eklendi. |
8.2.0 | DNF türleri desteklenmeye başlandı. |
8.2.0 | true kendisi tür olanlardan biri olarak eklendi. |
8.2.0 | null ve false tek başlarına kullanılabilir oldu. |
8.1.0 | Kesişim türleri desteklenmeye başlandı. |
8.1.0 | void dönüş türünde bir işlevden dönen değere başvuru artık önerilmiyor. |
8.1.0 | never dönüş türü desteklenmeye başlandı. |
8.0.0 | mixed türü desteklenmeye başlandı. |
8.0.0 | static dönüş türü desteklenmeye başlandı. |
8.0.0 | Birleşik türler desteklenmeye başlandı. |
7.4.0 | Sınıf özellik türü bildirim desteği eklendi. |
7.2.0 | object türü desteklenmeye başlandı. |
7.1.0 | iterable türü desteklenmeye başlandı. |
7.1.0 | void türü desteklenmeye başlandı. |
7.1.0 | Null olabilen türler desteklenmeye başlandı. |
Temel türler, bu bölümde açıklanan bazı küçük yetersizlikler dışında basit şekilde davranır.
Sayıl türler (bool, int, float, string) için takma adlar desteklenmemekte, bunlar bir sınıf veya arayüz adı olarak ele alınmaktadır. Örneğin, tür bildirimi olarak boolean
, değerin bool türünden ziyade boolean
isimli sınıfın veya arayüzün bir örneği olmasını 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
Bilginize:
void dönüş türünde bir işlevden dönen değere başvuru çelişki sebebiyle PHP 8.1.0 ve sonrasında önerilmemektedir. Evvelce böyle bir çağrı şöyle bir
E_NOTICE
çıktılıyordu: Only variable references should be returned by reference (Yalnızca değişkene atıflar atıf olarak döndürülebilir).<?php
function &test(): void {}
?>
Bu türler sınıf özelliği türü olarak kullanılamaz.
Bilginize: İşlev bildirimi olarak belirtilemez.
Atıf olarak aktarılan bir bağımsız değişkende tür bildirimi yapılmışsa değişkenin türü işlev dönerken değil, yalnızca çağrının başında işlev girdisi olarak sınanır. Yani işlev atıf yapılan değişkenin türünü değiştirebilir.
Örnek 1 - Atıf olarak aktarılan tür bildirimli bağımsız değişkenler
<?php
function array_baz(array &$param)
{
$param = 1;
}
$var = [];
array_baz($var);
var_dump($var);
array_baz($var);
?>
Yukarıdaki örnek şuna benzer bir çıktı üretir:
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
Birleşik tür bildirimleri ile ilgili birkaç kısıtlama vardır ve basit hataları önlemek için derleme sırasında gereksiz fazlalık denetimi yapılır.
PHP 8.2.0 öncesinde ve DNF türler desteklenmeye başlandığında kesişim türlerini bileşik türlerle birleştirmek mümkün değildi.
PHP 8.2.0 öncesinde, false
ve null tek başlarına kullanılamadığından yalnızca bu türlerden ibaret bir bileşik türe izin verilmezdi. İzin verilmeyen tür bildirimleri: false
, false|null
ve ?false
.
Temel tür bildirimlerinden yalnızca biri, türün önüne bir soru imi (?
) konularak null olabilir olarak imlenebilir. Bu bakımdan ?T
ve T|null
aynıdır.
Bilginize: Bu sözdizimi PHP 7.1.0 ve sonrasında desteklenmekte olup genelleştirilmiş bileşik tür desteğinden önce desteklenmekteydi.
Bilginize:
null
öntanımlı değer yapılarak null olabilir bağımsız değişkenler elde etmek de mümkündür. Bir alt sınıfta öntanımlı değer değiştirilirse, tür bildirimine null türün eklenmesini gerektireceğinden ve dolayısıyla tür uyumluluğunu bozacağından bu önerilmez.Örnek 2 - Bağımsız değişkenlerin null olabilmesinin 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
Birleşik tür bildirimlerindeki basit hataları yakalamak için, sınıf yüklemeden algılanabilen gereksiz türler, derleme zamanı hatasına neden olur. Bunlar:
int|string|INT
ve Countable&Traversable&COUNTABLE
gibi türler hataya neden olur. Bilginize: Bu, türün "en az" olasılığını garanti etmez çünkü bunu yapmak, kullanılan tüm sınıf türlerinin yüklenmesini gerektirir.
Örneğin, A
ve B
sınıf takma adlarıysa, A or B
'ye indirgenebilse bile A|B
uygun bir bileşik tür olarak kalır. Benzer şekilde, B extends A {}
ise, yalnızca A'ya indirgenebilse bile A|B
uygun bir bileşik türdür.
<?php
function foo(): int|INT {} // izin verilmez
function foo(): bool|false {} // izin verilmez
function foo(): int&Traversable {} // izin verilmez
function foo(): self&Traversable {} // izin verilmez
use A as B;
function foo(): A|B {} // izin verilmez ("use" ad çözünürlüğünün parçasıdır)
function foo(): A&B {} // izin verilmez ("use" ad çözünürlüğünün parçasıdır)
class_alias('X', 'Y');
function foo(): X|Y {} // izin verilir (gereksizlik yalnızca çalışma anında saptanabilir)
function foo(): X&Y {} // izin verilir (gereksizlik yalnızca çalışma anında saptanabilir)
?>
Örnek 3 - Temel sınıf türü bildirimi
<?php
class C {}
class D extends C {}
// C'yi genişletmiyor.
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 4 - Temel arayüz türü bildirimi
<?php
interface I { public function f(); }
class C implements I { public function f() {} }
// 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 5 - Temel dönüş türü bildirimi
<?php
function sum($a, $b): float {
return $a + $b;
}
// dikkat: float dönecek
var_dump(sum(1, 2));
?>
Yukarıdaki örneğin çıktısı:
float(3)
Örnek 6 - 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) { }
Örnek 7 - Null olabilen bağımsız değişken 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 8 - Null olabilen dönüş türü bildirimi
<?php
function get_item(): ?string {
if (isset($_GET['item'])) {
return $_GET['item'];
} else {
return null;
}
}
?>
PHP öntanımlı olarak, yanlış türdeki değerleri mümkün olduğunca beklenen sayıl türe zorlar. Örneğin, bir dizge aktarılması gereken bir bağımsız değişkene tamsayı bir değer aktarılırsa, işlev int değil string türünde bir değişken alır.
Katı kipi her dosya için ayrı ayrı etkinleştirmek mümkündür. Katı kipte, yalnızca tür bildirimine tam olarak karşılık gelen değer kabul edilir, aksi takdirde bir TypeError oluşur. Bu kuralın tek istisnası, float tür bildirimine rağmen int türünde değer aktarmaktır.
Dahili işlevler içinden yapılan işlev çağrıları, strict_types
bildiriminden etkilenmez.
Katı kipi etkinleştirmek için, strict_types
bildirimi declare
deyiminde kullanılır:
Bilginize:
Katı kodlama, katı kodlamanın etkinleştirildiği dosya içindeki işlev tanımlarına değil, işlev çağrılarına uygulanır. Katı kodlama etkin olmayan bir dosyadan, katı kodlamanın etkinleştirildiği dosya içinde tanımlanmış bir işleve çağrı yapılırsa, çağrıyı yapanın tercihine (zorlayıcı kodlama) saygı gösterilecek ve değer zorlanacaktır.
Bilginize:
Katı kodlama yalnızca sayıl tür bildirimleri için tanımlanmıştır.
Örnek 9 - Bağımsız değişken değerlerinde 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 10 - Bağımsız değişken değerlerinde zorlayıcı kodlama
<?php
function sum(int $a, int $b) {
return $a + $b;
}
var_dump(sum(1, 2));
// Değerler tamsayıya zorlanır. Çıktıya dikkat!
var_dump(sum(1.5, 2.5));
?>
Yukarıdaki örneğin çıktısı:
int(3) int(3)
Örnek 11 - Dönüş değerlerinde 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
Örnek 12 - Sınıf özellik türü bildirimi
<?php
class User {
public static string $foo = 'foo';
public int $id;
public string $username;
public function __construct(int $id, string $username) {
$this->id = $id;
$this->username = $username;
}
}
?>