recherche

Maison  >  Questions et réponses  >  le corps du texte

Méthodes qui renvoient une sous-classe d'une propriété @returns

<p>J'ai une classe abstraite <code>Foo</code> et un constructeur abstrait <code>FooBuilder</code></p> <pre class="brush:php;toolbar:false;">classe abstraite Foo { } classe abstraite FooBuilder { modèle Foo $ protégé ; /*** Instance de classe de retour * * @return Model //Quel est le type de retour correct ? ?*/ fonction publique get() { return $this->model; } } ≪/pré> <p>Je souhaite utiliser la méthode <code>get()</code> dans mon générateur enfant, mais l'EDI détecte que le type de retour est une sous-classe, et non un abstrait <code>Foo</code> ; . </p> <pre class="brush:php;toolbar:false;">class Bar étend Foo { } classe abstraite BarBuilder { fonction publique __construct() { $this->model = new Bar(); } } $barBuilder = BarBuilder(); $bar = $barBuilder->get(); //Le type est "Bar", mais l'EDI pense que c'est "Foo" ≪/pré> <p>Existe-t-il un moyen dans PHPDoc de renvoyer le type statique d'une propriété au lieu de la classe ? Semblable à <code>@return static ($this->model)</code> ? </p> <p>Un exemple est l'utilisation d'Eloquent de Laravel dans <code>SomeModel::find()</code>. L'EDI sait que le type peut être <code>SomeModel</code>. Mais <code>@return</code> n'a que <code>Model</code>. </p>
P粉310931198P粉310931198455 Il y a quelques jours537

répondre à tous(1)je répondrai

  • P粉107991030

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

    Vous devez utiliser Foo comme type de retour dans votre exemple mais pour vous amuser, vous pouvez utiliser un type de retour statique pour déterminer la sous-instance comme indiqué ci-dessous

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

    répondre
    0
  • Annulerrépondre