0

PHPオブジェクトの継承状況についてのガイダンスが必要です。私は持っています:次のような構成オブジェクト:

configuration{
    var driver = 'mysql'; // or 'mssql';
    var host = 'database_host';
    var user = 'database_user';
    var password = 'database_password';
    var name = 'database_name';
}

2つのデータベースハンドラークラス:

class mysql{
    public mysql(){} // connect
    public query(){} // set a query
    public result(){} // load result
}

class mssql{
    public mysql(){} // connect
    public query(){} // set a query
    public result(){} // load result
}

とある種のクラスコントローラー:

class database{
    public function __construct(){
        $configuration = new configuration;
        /*
         * now, depending on the value of the $configuration->driver
         * my database class must inherit methods from mysql or mssql class
         */
        switch( $configuration->driver ){
            case 'mysql':
                // database inherit mysql methods
            break;
            case 'mssql':
            // database inherit mssql methods
            break;
        }
    }
}

次のような使用法:

$database = new database;
$database->query( 'select * from some_table' );
$result = $database->result();

したがって、データベースクラスのメソッドを使用する場合、構成オブジェクトに応じて、実際にはmysqlまたはmssqlメソッドを使用します。私のデータベースクラスがクラスコンストラクターで別のクラスを継承するようにしたいので、私が見る方法は受け入れられません。

私は誰かが私にこれをどのように行うことができるかについてアドバイスをくれることを望んでいました..言いましょう..正しい方法。

ありがとう。

4

2 に答える 2

1

ののの、これはおっと考えていません。次のキーワードをググってください。

実行したら、switch ステートメントをファクトリに配置し、クラス mysql をDBDriverという名前のインターフェイスにして、データベース クラスで戦略パターンを使用します。

于 2013-02-05T14:51:17.770 に答える
0

私と同じように混乱している誰かがこの投稿を読んだ場合、これが私が見つけた解決策です(数週間の調査の後-はい、数週間後):

シングルトン パターンを使用して、database という名前の親クラスを作成します。

class database{
    protected static $instances = array();

    // method to create a new instance of this object
    public function getInstance( $driver ){
        $instanceid = md5( $driver );

        if( self::$instances[ $instanceid ] == null ){
            self::$instances[ $instanceid ] = new $driver;
        }

        return self::$instances[ $instanceid ];
    }

    public function testFunction(){
        //do something else
    }
}

次に、ドライバー関数を作成します

class mysql extends database{
    public mysql(){} // connect
    public query(){} // set a query
    public result(){} // load result
}

class mssql extends database{
    public mysql(){} // connect
    public query(){} // set a query
    public result(){} // load result
}

今のように使用します

$database = database::getInstance( 'mysql' );
$database->query(); // works
$database->testFunction(); // works to

さらに、使用して好きにすることができます

$database = database::getInstance( 'mssql' );
$database->query(); // works
$database->testFunction(); // works to

彼の答えを正しいものとしてチェックを外したことについて、Froncoiseに謝罪する必要があります.

于 2013-03-04T18:42:38.483 に答える