2011-01-12 60 views
1

我已經創建了一個調用「__construct」中的對象的類,我如何讓這個對象在課堂上可用。如何將對象公開於類中的所有函數?

class SocialMedia { function __construct() { $object = "whatever"; } } 

我該如何在類中的其他函數(它是靜態的)中訪問$ object。 我試過使用「$ this-> object」,但當我嘗試從其他靜態函數中調用它時,出現錯誤「$ this when not in object context」。

+0

我也嘗試使$ object公開,但仍然無法訪問該對象。 –

回答

5

使用

self::$object = 'whatever' 

,而不是和閱讀PHP Manual on the static keyword

在一個旁註,statics are death to testability,所以你可能剛算了,你剛剛學到什麼,並用實例變量來代替。

+0

感謝您的鏈接,這是一個很好的閱讀。我以「無論」爲例。真的,我正在初始化一個類/ lib(Facebook的sdk),它只能在腳本運行中實例化一次。 –

+0

@thesocialhacker然後在引導文件中執行此操作,並將實例傳遞給需要它的任何對象。這就是所謂的依賴注入,它將使您的應用程序在長期內更易於維護。 – Gordon

+0

謝謝,我會把它交給我們的主要開發人員。看看他是否對我應該如何處理這個問題有任何想法。 –

2

嘗試在類的範圍內定義對象,在函數的正上方。所以,作爲一個例子:

class SocialMedia { public $object; function __construct() { $object = "whatever"; } } 

或者你可以嘗試將其定義爲「公共靜態」而不是「公共」。作爲一個例子,這樣的:

class SocialMedia { public static $object; function __construct() { $object = "whatever"; } } 
1

如果$object是不是靜態的,那麼你有問題。您需要能夠引用該類的特定實例。 youll需要社會化媒體的實際實例傳遞給它的靜態方法或者想出一些其他的惡作劇:

public static function someMethod(SocialMedia $instance, $args) 
{ 
    // do stuff with $instance->object and $args 
} 

public function methodThatUsesStaticMethod($args) 
{ 
    self::someMethod($this, $args); 
} 

如果$object是靜態的,那麼你可以使用範圍解析操作符來訪問它作爲其他人所說的:

public static $object; 

public static function someMethod($args) 
{ 
    $object = self::$object; 
    // do stuff with $object and $args 
} 

但是,你有另一個問題......如果沒有創建SocialMedia的實例,那麼SocialMedia::$object尚未設置,會發生什麼?

2

使其靜:

class SocialMedia { 

    protected static $object; 

    function __construct() { 
     self::$object = "whatever"; 
    } 
} 
0

你可以讓你的類單身(OOP Patterns in PHP Manual),但如果你想測試性和/或依賴注入真的是沒有什麼更好的解決方案。無論你如何建議,你都會遇到一個全局變量,遲早你會發現他們帶來的所有麻煩。

相關問題