关于继承类的PHP新self()创建基类对象

问题描述:

我有一个充当基类的类。然后我有几个其他类从它继承。我想用静态语法开始加载继承的类,但行为没有多大意义。关于继承类的PHP新self()创建基类对象

直到现在我加载了这样的类,它完成了这项工作。

$obj = new foo(); 
$something = $obj->ByID(1); 

我希望能够像这样调用ByID函数。

$something = foo::Get()->ByID(1); 

上述代码正在工作,但它没有调用继承类,它正在加载基类。我想我可以看到为什么会发生这种情况,但它没有任何意义。在.NET中,“this”将始终适用于继承的对象,但它不是以这种方式在我这里工作。

我有一个基类栏用以下方法。这在继承的类中不会被覆盖。事实上,继承的类只包含1个单一属性。

class bar 
{ 
    public $directory; 
    public function Get() 
    { 
     return new self(); 
    } 

    public function ByID($id) 
    { 
     //get the record from the file by using $directory to find the file. 
    } 
} 

class foo extends bar 
{ 
    public $directory = "/something/"; 
} 

遇到的问题IM是,当我在一个静态的方式加载类,自()被返回的基类的对象,而不是继承的类。我需要继承的类的$directory属性。继承的类当然会包含额外的功能和其他的东西,但现在这是阻止我实现这样的代码的障碍。任何想法我做错了什么?

我不想在每个继承的类中重写Get()。有了laravel,我可以记住模型类具有类似的结构,您可以创建一个模型,其中有一个属性是表的名称,并且不管怎样它都可以正常工作。

+1

[延迟静态结合](http://php.net/manual/en/language.oop5.late-static-bindings.php) –

+0

和'获取()'应该被定义为一个静态方法('公共静态函数Get()')如果你正在静态访问它(像你一样) –

改为使用静态绑定。

public static function Get() { 
    return new static(); 
}