繁体   English   中英

“self”如何在继承的类中完全正常工作?

[英]How does 'self' exactly work in inherited classes?

根据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

in parent class does NOT exactly inherit into the child, it works more like to this: 这意味着父类中的并不完全继承到子级,它更像是这样:

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

这是PHP的一个功能还是一个bug? 或者是这样的意思?

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

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()时才会起作用,或者一个错误告诉我一个变量显示函数存在的位置会跳出来。

听起来你正在描述被称为“后期静态绑定”的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();

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

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

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

在PHP中,类不是对象。 因此,没有静态方法的继承(实际上,它们与全局函数类似)。

所以,当C_foo说self时,它总是意味着C_foo(即使你从C_bar调用了一个方法)。

如果要从抽象类方法创建实例,则应尝试使用Factory模式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM