继承类上的PHP new self()正在创建一个基类对象[重复]

Posted

技术标签:

【中文标题】继承类上的PHP new self()正在创建一个基类对象[重复]【英文标题】:PHP new self() on inherited class is creating a base class object [duplicate] 【发布时间】:2016-09-13 07:18:13 【问题描述】:

我有一个作为基类的类。然后我有几个其他类继承自它。我想开始使用静态语法加载继承的类,但这种行为没有多大意义。

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

$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/";

我遇到的问题是,当我以静态方式加载类时,self() 返回的是基类的对象,而不是继承的类。我需要继承类中的$directory 属性。继承的类当然会包含额外的函数和其他东西,但现在这是阻止我实现这样的代码的障碍。知道我做错了什么吗?

我不想在每个继承的类中都重写 Get()。使用 laravel,我可以记住具有类似结构的模型类,您可以在其中创建具有 1 个属性的模型,该属性是表的名称,并且以某种方式一切正常。

【问题讨论】:

Late static binding 如果您以静态方式访问 Get(),则应将其定义为静态方法 (public static function Get()) 【参考方案1】:

改用静态绑定。

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

【讨论】:

以上是关于继承类上的PHP new self()正在创建一个基类对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

对比 PHP 中 new static() 与 new self()

lombok在继承类上的使用

类上的 C++ 容器,返回指针

父类上的注解能被子类继承吗

子类可以继承到父类上的注解吗

父类上的注解能被子类继承吗