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 dipanggilJenis 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 sendiriTanpa 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 samaDengan 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 pengembalianclass 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();
}
} 1Adalah 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();
}
} 1Misalnya, 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 kesalahanclass 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 MundurKode dengan tipe pengembalian static _ tidak akan kompatibel mundur dengan versi PHP yang lebih lama sebelum 8. 0. Melakukannya akan menghasilkan kesalahan penguraian |