【问题标题】:self:: referring to derived class in static methods of a parent classself:: 在父类的静态方法中引用派生类
【发布时间】:2015-06-30 19:40:31
【问题描述】:

我喜欢this answer 中提出的想法,允许在 PHP 中使用多个构造函数。我的代码类似于:

class A {
    protected function __construct(){
    // made protected to disallow calling with $aa = new A()
    // in fact, does nothing
    }; 

    static public function create(){
        $instance = new self();
        //... some important code
        return $instance;
    }

    static public function createFromYetAnotherClass(YetAnotherClass $xx){
        // ...
    } 

class B extends A {};

$aa = A::create();
$bb = B::create();

现在我想创建一个派生类B,它将使用相同的“伪构造函数”,因为它是相同的代码。但是,在这种情况下,当我不编写 create() 方法时,self 常量是类 A,所以变量 $aa$bb 都属于类 A,而我希望 @987654331 @be 上课B.

如果我使用$this 特殊变量,这当然是B 类,即使在A 范围内,如果我从B 调用任何父方法。

我知道我可以复制整个 create() 方法(也许 Traits 有帮助?),但我还必须复制所有“构造函数”(所有 create* 方法),这很愚蠢。

我如何帮助$bb 变成B,即使在A 上下文中调用该方法?

【问题讨论】:

  • 您正在寻找Late Static Bindings
  • 也许你想要static而不是self
  • @bishop 谢谢 - 它奏效了。您能否创建一个答案以便我接受?
  • @ArtisiticPhoenix 不,parent 错了,因为我想往下走,给孩子,而不是给父母,但static 工作得很好,谢谢大家

标签: php static-methods multiple-constructors


【解决方案1】:

您想使用static,它表示调用该方法的类。 (self 表示方法在其中定义的类。)

static public function create(){
    $instance = new static();
    //... some important code
    return $instance;
}

请参阅Late Static Bindings 上的文档。

您需要 PHP 5.3+ 才能使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-24
    • 2012-06-25
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 2010-10-10
    • 2011-01-18
    • 2011-03-05
    相关资源
    最近更新 更多