cari

Rumah  >  Soal Jawab  >  teks badan

Kaedah yang mengembalikan subkelas sifat @returns

<p>Saya mempunyai kelas abstrak <code>Foo</code> dan pembina abstrak <code>FooBuilder</code></p> <pre class="brush:php;toolbar:false;">abstract class Foo { } kelas abstrak FooBuilder { dilindungi Foo $model; /*** Kembalikan contoh kelas * * @return Model //Apakah jenis pulangan yang betul? ?*/ fungsi awam get() { pulangkan $this->model; } } </pra> <p>Saya mahu menggunakan kaedah <code>get()</code> dalam pembina anak saya, tetapi IDE mengesan bahawa jenis pulangan ialah subkelas, bukan <code>Foo</code> ; . </p> <pre class="brush:php;toolbar:false;">class Bar memanjangkan Foo { } kelas abstrak BarBuilder { fungsi awam __construct() { $this->model = new Bar(); } } $barBuilder = BarBuilder(); $bar = $barBuilder->get(); //Jenisnya ialah "Bar", tetapi IDE menganggapnya "Foo" </pra> <p>Adakah terdapat cara dalam PHPDoc untuk mengembalikan jenis statik harta dan bukannya kelas? Serupa dengan <code>@return static($this->model)</code>? </p> <p>Contohnya ialah penggunaan Laravel's Eloquent dalam <code>SomeModel::find()</code>. IDE mengetahui bahawa jenis itu boleh menjadi <code>SomeModel</code>. Tetapi <code>@return</code> hanya mempunyai <code>Model</code>. </p>
P粉310931198P粉310931198441 hari yang lalu518

membalas semua(1)saya akan balas

  • P粉107991030

    P粉1079910302023-08-30 21:49:39

    Anda harus menggunakan Foo sebagai jenis pulangan dalam contoh anda; tetapi untuk keseronokan anda boleh menggunakan jenis pulangan statik untuk menentukan sub-contoh seperti yang ditunjukkan di bawah

    class Foo
    {
        /**
         * @return string
         */
        public function Iam(): string
        {
            return "hello";
        }
    }
    
    class Helper
    {
        /**
         * Return the class instance
         *
         * @return static
         */
        public static function get(): static
        {
            return new self();
        }
    }
    
    class FooBuilder extends helper
    {
        protected Foo $model;
    
        public function mememe()
        {
            echo "I am a method";
        }
    }
    
    class FooBuilder2 extends helper
    {
        protected Foo $model;
    
        public function xray()
        {
            echo "I am a method";
        }
    }
    
    $test = FooBuilder::get();
    $test->mememe();
    
    $test2 = FooBuilder2::get();
    $test2->xray();

    balas
    0
  • Batalbalas