Metode kelas PHP dapat mengembalikan
class Foo {
- /**
- * @return static
- */
- public static getInstance() {
+ public static getInstance(): static {
return new static();
}
}
0 dan
class Foo {
- /**
- * @return static
- */
- public static getInstance() {
+ public static getInstance(): static {
return new static();
}
}
1 di versi sebelumnya, tetapi
static
tidak diizinkan di versi PHP sebelum 8. 0. Jenis pengembalian
static
_ yang baru diizinkan memungkinkan untuk mempersempit jenis pengembalian ke kelas yang dipanggil
Jenis pengembalian static
_ membantu kelas dengan metode yang lancar (mis. e yang memiliki
class Foo {
- /**
- * @return static
- */
- public static getInstance() {
+ public static getInstance(): static {
return new static();
}
}
5), kelas yang tidak dapat diubah (i. e
class Foo {
- /**
- * @return static
- */
- public static getInstance() {
+ public static getInstance(): static {
return new static();
}
}
6) atau metode statis yang mengembalikan turunan dari kelas itu sendiri
Tanpa tipe static
_ yang diizinkan dalam tipe pengembalian, seseorang harus menggunakan
class Foo {
- /**
- * @return static
- */
- public static getInstance() {
+ public static getInstance(): static {
return new static();
}
}
0 sebagai tipe pengembalian, yang mungkin bukan tipe yang ideal. PHP DocBlock sudah mengizinkan
class Foo {
- /**
- * @return static
- */
- public static getInstance() {
+ public static getInstance(): static {
return new static();
}
}
_9 di DocBlock-nya untuk menunjukkan bahwa metode mengembalikan objek itu sendiri, atau turunan dari kelas yang sama
Dengan PHP8. 0's static
dukungan tipe pengembalian, sekarang dimungkinkan untuk mengganti pernyataan DocBlock
class Foo {
- /**
- * @return static
- */
- public static getInstance() {
+ public static getInstance(): static {
return new static();
}
}
9 dengan deklarasi tipe pengembalian
class Foo {
- /**
- * @return static
- */
- public static getInstance() {
+ public static getInstance(): static {
return new static();
}
}
static
jenis pengembalian mengikuti Prinsip Pergantian Liskov. Metode kelas anak dapat mengembalikan objek kelas yang lebih sempit daripada tipe pengembalian metode induk
Karena static
selalu merujuk ke nama kelas dari objek yang dipanggil (mis. e. sama seperti
class Foo {
public function getInstance(): mixed {}
}
class Bar extends Foo {
public function getInstance(): object|null {}
}
class Baz extends Bar {
public function getInstance(): object {}
}
class Qux extends Baz {
public function getInstance(): parent {}
}
class Quux extends Qux {
public function getInstance(): self {}
}
class Corge extends Quux {
public function getInstance(): static {}
}
_4),
static
adalah himpunan bagian dari
class Foo {
- /**
- * @return static
- */
- public static getInstance() {
+ public static getInstance(): static {
return new static();
}
}
0, yang pada gilirannya merupakan himpunan bagian dari
class Foo {
- /**
- * @return static
- */
- public static getInstance() {
+ public static getInstance(): static {
return new static();
}
}
1
Adalah mungkin bagi kelas anak untuk mengembalikan static
, bahkan jika tipe pengembalian metode induk adalah
class Foo {
- /**
- * @return static
- */
- public static getInstance() {
+ public static getInstance(): static {
return new static();
}
}
0, atau
class Foo {
- /**
- * @return static
- */
- public static getInstance() {
+ public static getInstance(): static {
return new static();
}
}
1
Misalnya, keseluruhan warisan berikut ini valid
Rantai pewarisan yang berlebihan hampir selalu merupakan ide yang buruk, dan mengarah ke kode yang tidak dapat dikelola. Cuplikan di bawah ini hanya untuk demonstrasi
class Foo {
public function getInstance(): mixed {}
}
class Bar extends Foo {
public function getInstance(): object|null {}
}
class Baz extends Bar {
public function getInstance(): object {}
}
class Qux extends Baz {
public function getInstance(): parent {}
}
class Quux extends Qux {
public function getInstance(): self {}
}
class Corge extends Quux {
public function getInstance(): static {}
}
_
Cuplikan di atas menggunakan PHP 8 lainnya. 0 fitur
Mencoba untuk "memperluas" cakupan jenis pengembalian dengan
class Foo {
- /**
- * @return static
- */
- public static getInstance() {
+ public static getInstance(): static {
return new static();
}
}
0,
class Foo {
- /**
- * @return static
- */
- public static getInstance() {
+ public static getInstance(): static {
return new static();
}
}
1, atau jenis pengembalian lainnya akan menyebabkan kesalahan
class Corge {
public function getInstance(): static {}
}
class Grault extends Corge {
public function getInstance(): parent {}
}
Fatal error: Declaration of Grault::getInstance(): Corge must be compatible with Corge::getInstance(): static in .. on line ...
Bahkan, juga tidak diperbolehkan untuk mengganti tipe pengembalian static
dengan nama kelas dari kelas anak atau kelas induk.
static
tipe pengembalian hanya diperbolehkan sebagai tipe pengembalian. Itu tidak diperbolehkan sebagai tipe properti atau tipe parameter
Ini karena tipe pengembalian static
_ selalu mempersempit ruang lingkup, yang tidak diperbolehkan dalam properti yang diketik dan tipe parameter
Hanya metode kelas yang dapat mendeklarasikan static
tipe kembalian. Fungsi atau penutupan standar tidak diizinkan untuk mendeklarasikan tipe pengembalian static
function get_instance(): static {}
Fatal error: Cannot use "static" when no class scope is active in .. on line ...
Dampak Kompatibilitas Mundur
Kode dengan tipe pengembalian static
_ tidak akan kompatibel mundur dengan versi PHP yang lebih lama sebelum 8. 0. Melakukannya akan menghasilkan kesalahan penguraian