2012-04-12 59 views
9

據PHP,類::自我總是指向類本身,而是因爲我寫下了這些代碼,一些奇怪的事情發生了:'自我'如何在繼承類中工作?

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("..."); 

也許有人會問,「你爲什麼不設置一個變量值爲,並將該變量用作__構造函數?「

像這樣:

... 
... 
function find($exp) { 
    ... 
    ... 
    $class_name = __class__; 
    $temp_model = new $class_name(); 
    ... 
    ... 
} 
... 

其實我這樣做,並得到了更怪異的結果:

只有上課的時候沒有任何屬性或功能,但find(),或它的工作原理告訴我一個變量的錯誤表明一個函數存在的地方會跳出來。

回答

-3

在PHP中,類不是對象。因此,沒有靜態方法的繼承(實際上,它們與全局函數相似)。

所以,當C_foo說自己的時候,它總是意味着C_foo(即使你從C_bar調用方法)。

如果要從抽象類方法創建實例,則應該嘗試使用Factory模式。

+0

謝謝你,我會盡力的工廠模式:) – 2012-04-12 21:14:50

1

這是因爲接收父級方法的類是該類的。所以:

$ bar是Bar,所以self ::指Bar,而不是Foo。即使這種方法來自Foo。

這可能與Java不同,但它可能表明PHP如何在內部進行繼承。

+0

現在我想改變我的代碼,可能是我真的需要去深入到這個語言,非常感謝:) – 2012-04-12 21:22:36

+0

是的,PHP認爲不同的繼承。這不是一個'堆棧',更多的是'合併'。 – 2012-04-12 21:23:42

+0

...嗯..我看,可能需要我一些時間才能適應它.. – 2012-04-12 21:26:54

16

這聽起來像你正在描述PHP功能,稱爲「後期靜態綁定」。

PHP提供了兩種語法:self::static::

static是在PHP 5.3中引入的,因爲很多人都希望self能夠正常工作。

查看PHP手冊,瞭解更多:http://php.net/manual/en/language.oop5.late-static-bindings.php

+0

在文檔中查找〜謝謝:) – 2012-04-12 21:25:15