[英]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.