PHPDoc 和后期(静态或动态)绑定

大多数 PHP IDE 依靠 phpdoc 来获取有关表达式类型的提示。然而,我经常使用这种模式,它似乎没有被覆盖:

class Control {
    private $label = '';

    /** @return ??? */
    public static function Make(){ return new static(); }

    /** @return ??? */
    public function WithLabel($value){  $this->label = $value;  return $this;  }

    /** @return void */
    public function Render(){ /* ... */ }
}

class Textbox extends Control {
   private $text = '';

    /** @return ??? */
    public function WithText($text){  $this->width = $text;  return $this;  }
}

现在我可以像这样使用类:

Textbox::Make()           // <-- late static binding, returns Textbox
   ->WithLabel('foo')     // <-- late dynamic binding, returns Textbox
   ->WithText('bar')      // <-- normal binding, returns Textbox
   ->Render();

有没有办法取代“???”s与某些东西,以便键入信息是正确的?


答案 1

对于可以扩展的类中的静态方法:

/** @return static */

对于最终静态方法:

/** @return Control */

对于非静态方法:

/** @return $this */

但它没有记录在phpdoc手册中

请注意,现在任何Intelij IED(如PhpStorm 2019)都支持所有三个,和(在PhpDoc中作为返回类型)。static$thisself


答案 2

更新的答案以最流行的PHP IDE(PHPStorm 8)为参考:

因为您可以使用:@return

  • self
  • $this

因为您可以使用:@method

  • $this

例:

/**
 * Class Model
 * @method $this parentMethodA
 */
class Model
{
    /**
     * @return $this
     */
    public function parentMethodB()
    {
        return $this;
    }

    /**
     * @return self
     */
    public function parentMethodC()
    {
        return $this;
    }
}


/**
 * Class Person
 * @method $this childMethodA
 */
class Person extends Model
{
    /**
     * @return $this
     */
    public function childMethodB()
    {
        return $this;
    }

    /**
     * @return self
     */
    public function childMethodC()
    {
        return $this;
    }
}

$p = new Person();

//In the following lines IDE will recognize those variables as:
$t1 = $p->parentMethodA(); //Instance of Person
$t2 = $p->parentMethodB(); //Instance of Person
$t3 = $p->parentMethodC(); //Instance of Model
$t4 = $p->parentMethodA(); //Instance of Person
$t5 = $p->parentMethodB(); //Instance of Person
$t6 = $p->parentMethodC(); //Instance of Person

PHPStorm 10 (EAP) 的更新

现在似乎也可以使用,但仅适用于.static@return


推荐