suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Methoden, die eine Unterklasse einer Eigenschaft @returns zurückgeben

<p>Ich habe eine abstrakte Klasse <code>Foo</code> und einen abstrakten Builder <code>FooBuilder</code></p> <pre class="brush:php;toolbar:false;">abstract class Foo { } abstrakte Klasse FooBuilder { protected Foo $model; /*** Klasseninstanz zurückgeben * * @return Model //Was ist der richtige Rückgabetyp? ?*/ öffentliche Funktion get() { return $this->model; } } </pre> <p>Ich möchte die Methode <code>get()</code> in meinem untergeordneten Builder verwenden, aber die IDE erkennt, dass der Rückgabetyp eine Unterklasse und kein abstrakter <code>Foo</code> ist. . </p> <pre class="brush:php;toolbar:false;">class Bar erweitert Foo { } abstrakte Klasse BarBuilder { öffentliche Funktion __construct() { $this->model = new Bar(); } } $barBuilder = BarBuilder(); $bar = $barBuilder->get(); //Der Typ ist „Bar“, aber die IDE denkt, es sei „Foo“ </pre> <p>Gibt es in PHPDoc eine Möglichkeit, den statischen Typ einer Eigenschaft anstelle der Klasse zurückzugeben? Ähnlich wie <code>@return static($this->model)</code>? </p> <p>Ein Beispiel ist die Verwendung von Laravel's Eloquent in <code>SomeModel::find()</code>. Die IDE weiß, dass der Typ <code>SomeModel</code> sein kann. Aber <code>@return</code> hat nur <code>Model</code>. </p>
P粉310931198P粉310931198452 Tage vor530

Antworte allen(1)Ich werde antworten

  • P粉107991030

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

    您应该在示例中使用Foo作为返回类型;但是为了好玩,您可以使用静态返回类型来确定子实例,如下所示

    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();

    Antwort
    0
  • StornierenAntwort