2011-08-13 95 views
4

這將會很奇怪。我有一個MySQL數據庫類和獨立的類。例如:Php從不同的類運行時延伸(擴展爲變量?)

class users extends MySQL 

這個類是用戶的一般類,所以可以多用幾次。 但是有時候,一個「MySQL_DEBUGGED」類存在,如果是這樣,我想從它擴展:

class users extends MySQL_DEBUGGED 

我想如果存在繼承MySQL_DEBUGGED,否則MySQL的類。如果我把它放到變量中,它會拋出一個錯誤。怎麼做?

+0

我可以問你爲什麼你有兩個不同的類(MYSQL和MYSQL_DEBUGGED)?在我看來,問題是你有兩個類,而不是隻有一個可以配置爲更詳細(即:調試)或不是 – laurac

+0

我不知道你在做什麼,但如果你只有兩個類由於調試,你應該使用一個記錄器(即:log4php),並配置它爲您的需要 – laurac

回答

1

您只需使用class_exists()函數即可。

if (class_exists('MySQL_DEBUGGED')) { 
    class users extends MySQL_DEBUGGED { 
     .... 
    } 
} else { 
    class users extends MySQL { 
     .... 
    } 
} 

雖然我不會推薦它。有條件地聲明類似乎是一場噩夢。

+0

多數民衆贊成是正確的,但然後所有的方法必須複製/粘貼,這就是我想避免 – deeped

4

我不認爲你可以繼承一個名字不是寫在PHP腳本中的類。


一個可能的解決辦法是:

  • 定義兩個類,都被稱爲MySQL,在兩個單獨的文件
  • 讓你users類始終擴展MySQL類(這意味着其中的一個兩個)
  • 根據具體情況,包括:
    • 文件包含「生產」 MySQL類,
    • 或包含「發展」 MySQL

這樣的文件,你的類總是延伸MySQL類 - 但你會包括正確的一個


基本上,在你的主文件,你必須:

if (DEBUG) { 
    require __DIR__ . '/MySQL-debug.php'; 
} 
else { 
    require __DIR__ . '/MySQL-production.php'; 
} 

class users extends MySQL { 
    // ... 
} 

而且兩者MySQL-debug.phpMySQL-production.php將包含一個叫MySQL類 - 這將不包含在這兩個文件同樣的東西,的課程。

+0

+1,這是一個遠更好的方式來做到這一點。 – Brad

+0

這看起來更好,但MySQL調試繼承MySQL生產:)所以類名不能相同 – deeped

+1

@deeped humph,太糟糕了;那麼MySQL-debug和MySQL-production如何擴展一個通用的MySQL常用類,它將包含所有的通用代碼? –

1

最簡單的解決方案是擁有一個空的「橋」類,並始終從該類繼承。

然後,你需要聲明兩次的唯一類將是空的。

if (class_exists('MySQL_DEBUGGED')) { 
    class MySQLBridge extends MySQL { } 
} else { 
    class MySQLBridge extends MySQL_DEBUGGED { } 
} 

class User extends MySQLBridge { 
    // ... your code ... 
} 

最後在您的網頁:

require_once('User.php'); 
$user = new User(); 

其他建議的解決方案需要你有你的繼承類,我不建議的兩個副本。