2012-06-06 64 views
14

好,我有這樣的代碼,是我學習靜態和非靜態PHP中的調用

class scope{ 

    function printme(){ 
     return "hello"; 
    } 

    public static function printme(){ 
     return "hello"; 
    } 

} 

$s = new scope(); 
echo $s->printme(); //non-static call 
echo "<br>"; 
echo scope::printme(); //static call 

現在,這是不是真的我的項目的代碼,但這些是我想要做的

的事情
  1. 我想創建一個類將包含靜態和非靜態函數。
  2. 我想要一個函數在靜態和非靜態調用中都可用。

由於非靜態函數有很多操作,所以我也需要將它作爲一個靜態函數來調用,這樣我就不需要實例化這個類。這可能嗎?或者我真的需要將函數重寫爲另一個函數或類?

注:告訴我,如果我已經做了一些不好的編程。

回答

34

這裏是規則:

靜態方法可以在靜態方法和非靜態方法中。

非靜態方法只能用於非靜態方法。

+0

但是,如果我使用self ::它的作用,從靜態方法調用非靜態方法。爲什麼? –

+0

Php允許你這樣做並不意味着你應該這樣做。 self :: works是因爲你的非靜態方法不使用$ this,如果你在裏面使用$ this,它不應該工作。 – xdazz

+0

@RNKushwaha如果你從靜態方法中調用非靜態方法,如果使用$ this的非靜態方法,'非致命錯誤:未捕獲錯誤:當不在對象上下文中時使用$ this'會發生,如果非靜態方法不使用$ this,'PHP不推薦使用:非靜態方法test :: foo()不應該靜態調用'會發生。 – xdazz

2

As non-static function has a lot of operations on it, I also need to call it as a static function so that I will not need to instantiate the class. Is this possible? or I really needed to rewrite the function to another function or class?

如果您需要它,請將其設爲靜態。如果你不需要它,那麼保持它的方式。從非靜態函數中可以調用靜態函數。

class Foo 
{ 
    public function bar() 
    { 
     Foo::zex(); 

     // or self::zex() or even $this->zex(); 
    } 

    public static function zex() 
    { 
    } 
} 


$foo = new Foo; 
$foo->bar(); 

螞蟻反過來。

class Foo 
{ 
    public function bar() 
    { 

    } 

    public static function zex() 
    { 
     $foo = new Foo; 
     $foo->bar(); 
    } 
} 

當你應該這樣做,或者你應該這樣做是另一個問題。後者最常見的用途可能是Singleton模式。

6

如果您的類的實例很少需要,您可以讓靜態方法創建實例,調用非靜態方法並返回值。

class Scope { 
    public function mynonstatic() { 
    } 

    public static function mystatic() { 
     $s = new Scope(); 
     return $s->mynonstatic(); 
    } 
} 

請記住,靜態方法實際上只是一個縮小範圍的全局函數。他們是有用的,但不應該沒有很好的理由創建。