根据 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的一个功能还是一个错误?还是这样的意思?
否则,当我试图告诉一个类从自身创建对象时,就会发生这样的事情,代码是这样的:
class Models {
function find($exp) {
...
...
$temp_model = new self();
...
...
}
}
class Something extends Models {...}
$somethings = Something::find("...");
也许有人会问,“为什么不设置一个值为class的变量,并将该变量用作 __construction 函数?”
像这样:
...
...
function find($exp) {
...
...
$class_name = __class__;
$temp_model = new $class_name();
...
...
}
...
事实上,我这样做了,得到了一个更奇怪的结果:
它仅在类没有任何属性或函数但find()
,或者告诉我一个变量显示一个函数存在的地方会跳出的错误时才有效。