1

PHP クラス (汎用 ODBC データベース インターフェイス) があります。メソッドは変更されませんが (PDO を使用するため)、接続文字列は変更されます。ユーザーが接続文字列全体を手動で渡したり、接続文字列に配置される ODBC ドライバーを指定したりすることを避けるために、クラスを拡張して SQL Server 固有のバージョンを作成します。

汎用 PDO ODBC ドライバー

class PDO_ODBC implements DBDriver{
    private $driver;
    private $connection_string;

    public function connect(){
        if(!$this->driver || !$this->connection_string){
            throw new \Exception("Invalid connection string or database driver.");
        }
    }
}

SQL Server 固有のバージョン

class PDO_ODBC_SQL_Server extends PDO_ODBC{
    public function __construct(){
        $this->driver = 'SQL Server';
        $this->connection_string = 'odbc:Driver={[Driver]};Server=[Host];Database=[DBName];Uid=[Username];Pwd=[Password]';
    }
}

問題は、新しいPDO_ODBC_SQL_Serverオブジェクトを作成して を呼び出すと、 andが存在しないconnect()ために例外がスローされることです。しかし、これはどうしてですか?を使用すると、これらのプロパティの両方が表示されます。注意すべきことの 1 つは、次のように、ドライバーと接続文字列を除くすべてのプロパティのクラスの名前空間も示していることです: http://pastebin.com/qh40eDpa。実際、名前空間の下には、接続文字列とドライバーの個別の変数があります。$this->driver$this->connection_stringprint_rprint_r

基本 ODBC クラスを拡張して同様の設計パターンを使用しながら、これを修正して例外がスローされないようにするにはどうすればよいですか? そうでない場合は、開発者がドライバーと接続文字列を渡すことができるようにすることもできます...

簡潔にするために、上記のコード サンプルではプライベート変数のほとんどを省略していることに注意してください。これらのクラスは両方とも別々のファイルにあり、名前空間の下にありますLib\Database

4

1 に答える 1

1

クラスのプロパティをprotected作成するか、ゲッターとセッターをプライベートに保ちたい場合は作成します。プライベート プロパティは、派生クラスではなく、宣言されているクラスからのみアクセスできます。

class PDO_ODBC implements DBDriver{
    protected $driver;
    protected $connection_string;

    public function connect(){
        if(!$this->driver || !$this->connection_string){
            throw new \Exception("Invalid connection string or database driver.");
        }
    }
}

http://php.net/manual/en/language.oop5.visibility.php#language.oop5.visibility-members

于 2012-12-04T23:20:15.287 に答える