2013-01-14 30 views
3

我的意思是動態地改變派生類的基類。例如,有兩個類B1B2。當我運行參數class=b1 PHP腳本,一個類(比如class D)在腳本中定義的其他應延長class B1如果參數是class=b2它應該擴展B2有沒有PHP的動態擴展類的選項?

期待這樣的事情

class B1{ 
    // some codes 
} 

class B2{ 
    // some codes 
} 

switch($_GET['class']){ 
    case 'b1': $baseclass = "B1"; break; 
    case 'b2': $baseclass = "B2"; break; 
} 


class D extends $baseclass{ 
    // some codes 
} 

有沒有像在PHP中的任何選項?如果有任何選項可用,請給我建議。

在此先感謝。

+4

這是一個糟糕的設計方法。 – hek2mgl

+0

其他建議? – prashu132

+0

@ hek2mgl:我找到了解決我的問題的方案。請驗證它是否是一種好方法。 – prashu132

回答

1

我不會建議動態地擴展類。儘管這可能是一個非常糟糕的設計,但會產生許多不必要的副作用。至少告訴一個:你將如何爲該類生成一個API文檔? (知道這是最小的問題)

與註釋的其他信息:你想建立像一個ORM可以與不同的數據庫,我首先想到的PDO。它允許使用相同的接口訪問大量數據庫。

如果出於某種原因需要一個非PDO的解決方案,你可以做一個設計是這樣的:

<?php 

class DatabaseStorage { 

    /** 
    * @var DB_Mysql|DB_SQLite|DB_Postgres ... 
    */ 
    protected $database; 


    /** 
    * @param DB_Mysql|DB_SQLite|DB_Postgres ... The inner database to be used 
    */ 
    public function __construct($database) { 
     $this->database = $database; 
    } 

    /** 
    * Connect to the database 
    */ 
    public function connect($host, $user, $password) { 
     $this->database->connect($host, $user, $password); 
    } 


    /** 
    * Query the database 
    */ 
    public function query($query) { 
     return $this->database->query($query); 
    } 

    // other methods may follow 
} 

然後使用類是這樣的:

$databaseType =$_GET['databaseType']; 

// you should check the value before using it!! 
/*if(!is_valid_database_type($databaseType)) { 
    die('BAD input'); 
}*/ 

$databaseClass = 'Database' . $databaseType; 
$database = new $databaseClass(); 

// use $database as argument to the storage constructor 
$storage = new DatabaseStorage($database); 

然而,這僅僅是一個例子。你會發現其他的方式從動態代碼生成,預防,

+0

感謝兄弟......讓我試試看我的應用:) – prashu132

+0

:)祝你好運!正如我所提到的,它只是一個例子,如何去做。 – hek2mgl

1

我已經找到了我的問題的解決方案。夥計們請驗證這是否是正確的方法。

現在我店B1和B2兩個不同的文件,但類名相同,需要根據需要動態的文件。

b1.php 
class B{ 
    // some codes 
} 

b2.php 
class B{ 
    // some codes 
} 

現在擴展d這樣

$baseclass = $_GET['class']; 

require_once($baseclass.'.php'); 

class D extends B{ 
    // some codes 
} 

這一個對我的作品。 :)

+0

@ hek2mgl這是一個好方法嗎? – prashu132

+0

我會說不!不要這樣做! :)這個想法本身,基類的動態選擇,是不好的設計。我真的很想給你的應用程序提出一個建議,這將在沒有這個的情況下運行,但是我需要更多關於你的應用程序的信息。這可能是'太多'爲stackoverflow – hek2mgl

+0

@ hek2mgl它只是應用程序的一部分。只爲我的應用程序寫一個ORM。這個例子中的D類將是一個可供用戶使用db的通用類。 B1,B2等將是不同類型數據庫的不同基類。它的選擇實際上取決於存儲在配置文件中的值(僅作爲參數僅作爲示例)。所以如果選擇了mysql,基類D將從指定訪問mysql數據庫的基類派生。 – prashu132

1

這是永遠不可能在PHP語言。