0

このコードでは、PDOを拡張しようとしています

class mypdo extends PDO{

    static public $db = null;

    public function __construct($dsn, $username=false, $password=false){
        if(self::$db==null){
            try {            
                self::$db = parent::__construct($dsn, $username, $password);
                self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            } catch (PDOException $e) {
              die("PDO CONNECTION ERROR: " . $e->getMessage() . "<br/>");
            }
        }
        return self::$db;
    }
}

私が電話するとき

$db = new mypdo(<here my DSN>,<here my user>,<here my password>);

このエラーが発生します

致命的なエラー:非オブジェクトのメンバー関数setAttribute()を呼び出す

エラーはこの行にあります

self::$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

setAttribute()PDOオブジェクトのメソッドですが、なぜこのエラーが発生するのですか?

このメソッドをクラスに追加すると、PDOが

public function lastInsertId($name) {
    return self::$db->lastInsertId($name); 
}

呼び出そうとすると、同じエラーメッセージが表示されます

正しいコードは

class mypdo extends PDO{

    static public $db = null;

    public function __construct($dsn, $username=false, $password=false){
        if(self::$db==null){
            try {            
                parent::__construct($dsn, $username, $password);
                parent::setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            } catch (PDOException $e) {
              die("PDO CONNECTION ERROR: " . $e->getMessage() . "<br/>");
            }
        }
        return self::$db;
    }

    public function runSQL($SQL) {
        return parent::exec($SQL);
    }

    public function lastInsertId($name) {
       return parent::lastInsertId($name);
    } 

}
4

1 に答える 1

3

PHP では、オブジェクト コンストラクター (この場合PDOは ) が値を返さないのが一般的です。

次のことをしている場合:

self::$db = parent::__construct($dsn, $username, $password);

PDOコンストラクター ( ) が値を返さない場合は、-value にparent::__construct()設定self::$dbしていますnull。はオブジェクトではないため、「オブジェクト以外のメンバー関数への呼び出し」setAttribute()というエラーが表示されるのはこのためです。null

テストするには、次のことを試すことができます。

parent::__construct($dsn, $username, $password);
self::$db = $this;

これにより、親のコンストラクターが呼び出さself::$dbれ、現在のインスタンスへの参照が設定されます。

于 2012-11-15T14:14:01.093 に答える