簡體   English   中英

“self”如何在繼承的類中完全正常工作?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM