2012-10-11 48 views
0

是否可以從類實例中提取所有方法並在全局空間中使用它們?在php的全局空間中使用類的函數?

說我有:

class Library { 
    public function num_one() { echo "number one"; } 
    public function num_two() { echo "number two"; } 
} 

後,我加載類的,我希望能夠使用的功能,而無需指定實例

include '/path/to/library-class.php'; 
$lib = new Library(); 

#$lib->num_one(); 
#$lib->num_two(); 

num_one(); 
num_two(); 
+1

你就錯了......如果你真的需要使用函數和類這樣的,你可能沒有,你可以在函數的包含文件中創建包裝功能。 –

+0

@ G-Nugget感謝包裝的想法,但它看起來不是一個方便的解決方案;對於一個我不得不寫出我想要包裝的每個函數,對於另一個我將不得不在每種情況下通過實例變量? – Ozzy

+2

在這種情況下,我會告訴你,你不需要使用'class',而是可以使用'procedural'方法,將所有函數保存在一個文件中,並在使用它們之前包含它們。 –

回答

1

你可以讓他們靜,例如

class Library { 
    public static function num_one() { echo "number one"; } 
    public static function num_two() { echo "number two"; } 
} 

然後你可以使用

Library::num_one() 
Library::num_two() 

你也不需要'$ lib = new Library();'然後:)

0

我不知道爲什麼你需要這樣做,因爲OOP的優點之一是將方法安全地封裝到名稱空間中並防止函數名稱的衝突。但是,如果你絕對需要這樣做(並且我認爲你可以並且應該以不必這樣做的方式進行重構),那麼可以這樣做;但是,如果你絕對需要這樣做(並且我認爲你可以並且應該以不必這樣做的方式進行重構)。你可以添加這/path/to/library-class.php:

class Library { 
    public function num_one() { echo "number one"; } 
    public function num_two() { echo "number two"; } 
} 

$global_Library = new Library(); 

function num_one ($whateverParameter) { 
    global $global_Library; 
    return $global_Library->num_one($whateverParameter); 
} 
// Continue adding your wrapper functions here. 

我還是覺得用靜態方法比你問做什麼好,即使他們不應該視爲治癒所有人。

http://code.google.com/p/google-singleton-detector/wiki/WhySingletonsAreControversial

+0

這是@ G-Nugget建議,但這是我想要避免!我希望能有一種類似於變量'extract'函數的方法。 – Ozzy

+0

@Stegrex完全正確的反模式,以這種方式使用靜態... – jleck

+0

@JamesLeckenby我仍然認爲你使用靜態的解決方案比我提供的更好,但正確的解決方案是簡單地實例化對象,並在需要它們的地方使用對象的方法,儘管OP不想使用它。那麼,我想如果一個人真的不想使用面向對象的優點,這只是一個個人選擇(聳聳肩)。 – Stegrex