“自我”在继承的类中究竟是如何工作的?
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()