PHP在继承类上使用new self()会创建一个基类对象。

11 浏览
0 Comments

PHP在继承类上使用new self()会创建一个基类对象。

我有一个充当基类的类,然后有几个其他继承自它的类。我想使用静态语法开始加载继承的类,但是行为并没有太多意义。\n到目前为止,我是这样加载类的,它起到了作用。\n$obj = new foo();\n$something = $obj->ByID(1);\n我想能够像这样调用ByID函数。\n$something = foo::Get()->ByID(1);\n上述代码有效,但它并没有调用继承的类,而是加载了基类。我想我知道为什么会发生这种情况,但这毫无意义。在.NET中,“this”始终适用于继承的对象,但在这里却不起作用。\n我有一个名为bar的基类,其中包含以下方法。该方法在继承的类中没有被覆盖。实际上,继承的类只包含一个属性。\nclass bar\n{\n public $directory;\n public function Get()\n {\n return new self();\n }\n public function ByID($id)\n { \n //通过使用$directory查找文件,从文件中获取记录。\n } \n}\nclass foo extends bar\n{\n public $directory = \"/something/\";\n}\n我遇到的问题是当我以静态方式加载类时,self()返回的是基类的对象而不是继承的类。我需要继承的类中的$directory属性。当然,继承的类将包含其他函数和其他内容,但现在这个问题阻碍了我按照这种方式实现代码。有没有人知道我做错了什么?\n我不想在每个继承的类中重写Get()。使用laravel时,我记得模型类具有类似的结构,你可以创建一个只有一个属性的模型,该属性是表的名称,而且它能正常工作。

0
0 Comments

问题:PHP中,当在继承类中使用PHP new self()创建一个基类对象时,出现了什么问题以及解决方法是什么?

在PHP编程中,我们经常会使用继承来实现代码的重用和扩展。然而,当在继承类中使用PHP new self()创建一个基类对象时,可能会遇到一些问题。

问题的原因是,使用PHP new self()在继承类中创建对象时,实际上会创建一个基类的对象,而不是继承类的对象。这是因为PHP new self()是在运行时绑定的,它会根据当前的类来确定要实例化的对象。由于继承类会继承基类的方法和属性,所以通过new self()创建的对象实际上是基类的对象。

为了解决这个问题,我们可以使用静态绑定(static binding)。静态绑定允许我们根据当前的类来动态地创建对象,而不是根据基类来创建对象。

以下是使用静态绑定解决问题的代码示例:

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

在这个示例中,我们使用了PHP的static关键字来代替self关键字。static关键字表示当前的类,而不是基类。通过返回new static(),我们可以创建一个继承类的对象,而不是基类的对象。

通过使用静态绑定,我们可以避免在继承类中使用PHP new self()创建基类对象的问题。这样,我们就可以正确地创建继承类的对象,并继承和使用继承类中的方法和属性。

0