根据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();
Run Code Online (Sandbox Code Playgroud)
我以为输出会是:
foo() from C_foo
foo() from C_bar
Run Code Online (Sandbox Code Playgroud)
但实际上:
foo() from C_foo
foo() from C_foo
Run Code Online (Sandbox Code Playgroud)
这意味着父类中的self并不完全继承到子级,它更像是这样:
foo() {return parent::foo();}
Run Code Online (Sandbox Code Playgroud)
这是PHP的一个功能还是一个bug?或者是这样的意思?
否则,当我试图告诉一个类从它自己创建对象时会发生这样的事情,代码是这样的:
class Models {
function find($exp) {
...
...
$temp_model = new self();
...
...
}
}
class Something extends Models {...}
$somethings = Something::find("...");
Run Code Online (Sandbox Code Playgroud)
也许有人会问,"为什么不用类的值设置变量,并将变量用作__construction函数?"
像这样:
...
...
function find($exp) {
...
...
$class_name = __class__;
$temp_model = new $class_name();
...
...
}
...
Run Code Online (Sandbox Code Playgroud)
事实上,我做到了这一点,并得到了一个更奇怪的结果:
它只适用于类没有任何属性或函数但是find(),或者告诉我一个变量显示函数存在的位置会跳出的错误.
Spu*_*ley 26
听起来你正在描述被称为"后期静态绑定"的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();
Run Code Online (Sandbox Code Playgroud)
Ale*_*iri -5
在 PHP 中,类不是对象。因此,静态方法没有继承(实际上,它们类似于全局函数)。
因此,当 C_foo 说 self 时,它始终表示 C_foo (即使您从 C_bar 调用了方法)。
如果您想从抽象类方法创建实例,您应该尝试工厂模式。
| 归档时间: |
|
| 查看次数: |
4446 次 |
| 最近记录: |