2012-05-01 19 views
8

可能重複:
PHP: Static and non Static functions and Objects在PHP中,爲什麼我能夠以靜態方式訪問非靜態方法?

在下面的代碼,非靜態()不是一個靜態方法。即使那樣我也能夠在不創建對象的情況下(以靜態方式)訪問它。任何人都可以幫助我理解,因爲在Java等其他語言中這是不可能的。

<?php 
class MyClass 
{ 
    function nonStatic() { 
     echo "This can be printed"; 
    } 
} 
MyClass::nonStatic(); // This can be printed 
+4

因爲面向對象的概念被鎖定在PHP上作爲事後的想法?嚴重的是,PHP不是OOP研究的模型。 – DGM

+0

只要不包含實例引用('$ this'),就可以靜態調用它。不知道你是否會在'E_STRICT'下面收到警告(我希望你會這麼做)。 –

+0

我不認爲這是重複的,因爲這個問題至少包含更好的解釋 –

回答

0

不知道,可能有些PHP魔術(有時候有點像),但你不應該這樣做。

在這裏閱讀更多http://php.net/manual/en/language.oop5.static.php

他們也表現出類似的例子,但要注意:

調用非靜態方法靜態生成E_STRICT級別的警告的含義這種神奇的能力可能在未來的版本中消失。所以不要這樣做:)

+1

通常,如果可能的話,PHP會盡可能不嘗試崩潰並燒壞,如果不必要的話。在他的例子中,沒有任何非靜態的,因此,該方法是有效的靜態。另一種想法是static的方法是讓php檢查以確保你沒有調用$ this,因爲這個方法是靜態使用的 - 這就是所有其他語言所做的。這只是一個構造。PHP一次編譯和執行,因爲它是一種腳本語言,所以它具有更大的靈活性,並使得將這種通常致命的錯誤轉化爲警告是可能的。 – 2012-05-01 02:15:55

2

似乎PHP的開發人員在禁止靜態訪問非靜態方法時看不到任何值。這只是PHP的特殊功能之一,並不能真正達到目的。當然,不正確的編程習慣是靜態調用一個非靜態的方法,但在PHP中是可能的。也許在未來的PHP版本中,他們將不允許這樣做,但現在,這只是該語言的一部分。

編輯:

值得慶幸的是,相反的是不允許的 - 你不能調用從對象上下文的靜態方法。 正如Jack指出的那樣,您可以從可調用從對象上下文中調用靜態方法 - 這在OOP範例中幾乎不是最佳實踐,但它是允許的。

+1

相反的* *實際上是允許的;不知道這是好還是壞;-) –

+0

謝謝你提醒我,傑克!我已更新我的評論。 – Andrew

6

這是允許的,但產生E_STRICT警告:

Error #: 2048, Error: Non-static method MyClass::nonStatic() should not be called statically, assuming $this from incompatible context 

,在此就默默允許PHP的早期OO實現,但更好的做法,因爲被採納。

相反的作品很順利,但:

class Test 
{ 
    function foo() 
    { 
     echo $this->bar(); 
    } 

    static function bar() 
    { 
     return "Hello world\n"; 
    } 
} 

$x = new Test; 
$x->foo(); 

這將打印Hello world

相關問題