3

私が意味したのは、派生クラスの基本クラスを動的に変更することです。たとえば、2つのクラスB1とがありB2ます。パラメータを指定してphpスクリプトを実行すると、そのスクリプトで定義されてclass=b1いるクラス(たとえば)は拡張する必要があります。パラメータが拡張する場合は、それ以外の場合は拡張する必要があります。class Dclass B1class=b2B2

このようなものを期待してください

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

3 に答える 3

1

問題の解決策を見つけました。みんな、これが正しいアプローチかどうかを確認してください。

現在、B1とB2を2つの別々のファイルに保存していますが、クラス名は同じで、動的に必要なファイルが必要です。

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 
}

これは私のために働きます。:)

于 2013-01-14T02:58:48.290 に答える
1

PHP言語では決して不可能です。

于 2013-02-08T14:51:40.760 に答える
1

クラスを動的に拡張することはお勧めしません。可能性はありますが、多くの望ましくない副作用を持つ非常に悪い設計です。少なくとも 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);

ただし、これはほんの一例です。動的コード生成を防止する他の方法を見つけることができます。

于 2013-01-15T03:00:56.980 に答える