2013-05-07 98 views
2

由於你可以用而不是使用$ this->在一個靜態函數中,你應該如何訪問靜態內部的常規函數​​?訪問一個靜態函數內的公共/私人函數?

private function hey() 
{ 
    return 'hello'; 
} 

public final static function get() 
{ 
    return $this->hey(); 
} 

此拋出一個錯誤,因爲你不能使用$這 - >內靜態。

private function hey() 
{ 
    return 'hello'; 
} 

public final static function get() 
{ 
    return self::hey(); 
} 

這引發以下錯誤:

Non-static method Vote::get() should not be called statically 

你怎麼能訪問靜態方法中常用數據處理方法?在同一類*

+0

如果要調用它們,則必須將不會訪問'$ this'的函數更改爲靜態函數。 – 2013-05-07 21:01:11

+0

將類引用傳遞給您的靜態方法。 – 2013-05-07 21:02:04

+0

我該怎麼做?就像在hey()中那樣,返回$ this-> get(「hello」)? – 2013-05-07 21:04:17

回答

3

靜態方法只能調用類中的其他靜態方法。如果你想訪問一個非靜態成員,那麼該方法本身必須是非靜態的。

或者,您可以將對象實例傳入靜態方法並訪問其成員。由於靜態方法是在同一個類中聲明你感興趣的靜態成員,應該還是因爲知名度如何在PHP

class Foo { 

    private function bar() { 
     return get_class ($this); 
    } 

    static public function baz (Foo $quux) { 
     return $quux -> bar(); 
    } 
} 

做不過請注意,只是因爲你可以做到這一點的工作,你是否應該這樣做是值得懷疑的。這種代碼打破了良好的面向對象的編程習慣。

+0

非常感謝!現在我明白了... – 2013-05-07 21:27:06

6

您可以提供一個參考的實例,以靜態方法:

class My { 
    protected myProtected() { 
     // do something 
    } 

    public myPublic() { 
     // do something 
    } 

    public static myStatic(My $obj) { 
     $obj->myProtected(); // can access protected/private members 
     $obj->myPublic(); 
    } 

} 

$something = new My; 

// A static method call: 
My::myStatic($something); 

// A member function call: 
$something->myPublic(); 

如上所示,靜態方法可以訪問對象私有和保護構件(屬性和方法)他們是其中的一員。

或者,如果您只需要一個實例,則可以使用singleton patternevaluate此選項)。