Php menggunakan sifat di luar kelas

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

Show

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

  • Jenis Serikat
    • class Corge {
          public function getInstance(): static {}
      }
      class Grault extends Corge {
          public function getInstance(): parent {}
      }
      _1 jenis pengembalian

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