“自我”在继承的类中究竟是如何工作的?

2022-08-30 23:08:33

根据php,class::self总是指向类本身,但是当我写下这些代码时,发生了一些奇怪的事情:

class C_foo{
    function foo() { return "foo() from C_foo"; }
    function bar() { echo self::foo(); }
}

class C_bar extends C_foo{
    function foo() { return "foo() from C_bar"; }
}

C_foo::bar();
C_bar::bar();

我以为输出应该是:

foo() from C_foo
foo() from C_bar

但事实上:

foo() from C_foo
foo() from C_foo

这意味着父类中的自我不会完全继承到子类中,它的工作方式更像这样:

foo() {return parent::foo();}

这是php的功能还是一个错误?还是说是故意的?

否则,当我试图告诉一个类从自身创建对象时,会发生这样的事情,代码是这样的:

class Models {
    function find($exp) {
        ...
        ...

        $temp_model = new self();
        ...
        ...
    }
}

class Something extends Models {...}

$somethings = Something::find("...");

也许有人会问,“你为什么不用的值设置一个变量,并将该变量用作__construction函数?

喜欢这个:

...
...
function find($exp) {
    ...
    ...
    $class_name = __class__;
    $temp_model = new $class_name();
    ...
    ...
}
...

事实上,我这样做了,并得到了一个更奇怪的结果:

它只适用于类没有任何属性或函数的情况,但是,或者告诉我一个变量显示函数灵魂存在位置的错误会跳出来。find()


答案 1

这听起来像是在描述被称为“后期静态绑定”的PHP功能。

PHP 提供两种语法:和 。self::static::

static在 PHP 5.3 中引入是因为很多人都希望按照你所描述的方式工作。self

有关详细信息,请参阅 PHP 手册:http://php.net/manual/en/language.oop5.late-static-bindings.php

您还可以使用以下语法或创建新实例:new self()new static()

$parent = new self();
$child = new static();

答案 2

这是因为接收父级方法的类是该类的类。所以:

$bar是Bar,因此self::指的是Bar,而不是Foo。即使该方法是来自Foo。

这可能与Java不同,但它可能表明PHP如何在内部进行继承。


推荐