2013-07-13 30 views
1

我正在嘗試OOP,但我很新,所以, 我已經創建了一個模塊joomla 2.5.x和它的主要php文件我require_once一個文件與類是這樣的:php不能重新聲明類/未定義的變量Joomla模塊

require_once(JPATH_SITE.'/modules/'.$module_dir.'/libs/classes.php'); 

classes.php包含此:

class experiment 
{ 
    function clean($input) 
    { 
     return filter_var($input, FILTER_SANITIZE_STRING); 
    } 
} 

$my = new experiment; 

然後在模塊php文件我使用它像:

$name = $my->clean($params->get('name')); 

直到這一點,它都表現正常。但是,只有當模塊在同一頁面上只出現一次。如果我複製模塊並在同一頁上使用它兩次,我會收到錯誤Undefined variable my。如果我將require_once更改爲require,則會收到錯誤Cannot redeclare class experiment。奇怪的。

我也試過if (!class_exists(..if(!isset($my)) { .. }但我知道這是行不通的。

我歡迎任何形式的幫助,歡呼聲。

回答

1

當你有一個文件,在該文件中定義的任何類,然後在全球上市,但任何變量都在同一範圍內包括 - 在這種情況下,只是你最初包含該文件中的函數內。

因此,當您使用require_once()時,您發現第二次嘗試包含它時,什麼也沒有發生 - 這是正常的,因爲該文件已包含在內,但$my變量也不是定義 - 因爲該功能在第一次結束時超出了範圍。

當您切換到require(),你會得到一個不同的錯誤,因爲你重新定義的類。


的此解決方案是不設置全局變量,當你確定你的類。定義類 - 然後當你需要使用它時,創建該類的一個實例。不要依賴於全局變量

如果您只想創建該類的一個實例(您確實需要這樣做嗎?),請使用singleton pattern來代替。

+0

哇!哈哈我沒想到在classes.php裏面加上'$ my = new experiment;'並把它放在模塊文件中。我只是因爲你的幫助而做到了這一點,它讓我大笑,它效果非常好!謝謝你,我真的很感謝:)這很簡單。 – durduvakis

+0

好吧,我有兩個原因進行了實驗。 1,所以我更確定函數名稱將不會在所有Joomla中找到,2,當然要慢慢地學習OOP ... – durduvakis

+0

謝謝你爲此,我將嘗試瞭解單身模式爲好! – durduvakis