根据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
这意味着父类中的 self 并不完全继承到子级,它更像是这样:
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()
时才有效,或者告诉我变量显示函数存在的位置会跳出来的错误。
答案 0 :(得分:21)
听起来您正在描述称为“后期静态绑定”的PHP功能。
PHP提供了两种语法:self::
和static::
。
static
,因为很多人都希望self
能够处理您所描述的内容。
有关详细信息,请参阅PHP手册:http://php.net/manual/en/language.oop5.late-static-bindings.php
您还可以使用语法new self()
或new static()
创建新实例:
$parent = new self();
$child = new static();
答案 1 :(得分:1)
这是因为接收父类方法的类属于该类。所以:
$ bar是Bar,因此self ::指的是Bar,而不是Foo。即使那个方法来自Foo。
这可能与Java不同,但它可能表明PHP如何在内部进行继承。
答案 2 :(得分:-3)
在PHP中,类不是对象。因此,没有静态方法的继承(实际上,它们与全局函数类似)。
所以,当C_foo说self时,它总是意味着C_foo(即使你从C_bar调用了一个方法)。
如果要从抽象类方法创建实例,则应尝试使用Factory模式。