コンストラクターの静的プロパティを使用して保持された PDO リソース ハンドルは、他のメソッドで呼び出すことはできませんか?

WBOY
リリース: 2016-06-13 12:24:57
オリジナル
934 人が閲覧しました

コンストラクターの静的プロパティを使用して保存された PDO リソース ハンドルは、他のメソッドで呼び出すことはできませんか? ? ?

<?php<br /><br />class DB{<br />    protected $link = '127.0.0.1';<br />    protected $dbname = 'think';<br />    static public $DB;<br />    private function __construct(){<br />        try{<br />            self::$DB = new PDO("mysql:host={$this->link};dbname={$this->dbname}",'root','root');<br />        }catch (PDOException $e){<br />            die("连接出错:".$e->getMessage());<br />        }<br /><br />        $sql = ' SELECT * FROM user WHERE id=? and username=? and email=? ';<br />        $stmt = self::$DB->prepare($sql);<br />        $stmt->execute([0=>'13',1=>'12',2=>'12']);<br />        echo '<pre class="brush:php;toolbar:false">';<br />        print_r($stmt->fetchAll(PDO::FETCH_ASSOC));<br />        echo $stmt->rowCount();<br />    }<br />    //静态方法,单例统一访问入口<br />    static public function getInstance() {<br />        if (is_null ( self::$DB ) || isset ( self::$DB )) {<br />            self::$DB = new self ();<br />        }<br />        return self::$DB;<br />    }<br />    public function Test(){<br />         $sql = ' SELECT * FROM user WHERE id=? and username=? and email=? ';<br />         $stmt = self::$DB->prepare($sql);<br />         $stmt->execute([0=>'13',1=>'12',2=>'12']);<br />         echo '<pre class="brush:php;toolbar:false">';<br />         print_r($stmt->fetchAll(PDO::FETCH_ASSOC));<br />         echo $stmt->rowCount();<br />    }<br />}<br />$db = DB::getInstance();<br />$db->Test();
ログイン後にコピー

コンストラクターで Test メソッドをコピーすることに問題はありません。なぜ Test メソッドに未定義メソッド DB::prepare() への呼び出しが表示されるのですか? ? ?
マスターの皆さんに聞いてください
-----解決策のアイデア----------------------
少なくとも
class DB{<br />    protected $link = '127.0.0.1';<br />    protected $dbname = 'think';<br />    static public $DB;<br />    static public $_DB;<br />    private function __construct(){<br />        try{<br />            self::$_DB = new PDO("mysql:host={$this->link};dbname={$this->dbname}",'root','root');<br />        }catch (PDOException $e){<br />            die("连接出错:".$e->getMessage());<br />        }<br />    }<br />    //静态方法,单例统一访问入口<br />    static public function getInstance() {<br />        if (is_null ( self::$DB ) <br><font color='#FF8000'>------解决思路----------------------</font><br> isset ( self::$DB )) {<br />            self::$DB = new self ();<br />        }<br />        return self::$DB;<br />    }<br />    public function Test(){<br />         $sql = ' SELECT * FROM user WHERE id=? and username=? and email=? ';<br />         $stmt = self::$_DB->prepare($sql);<br />         $stmt->execute([0=>'13',1=>'12',2=>'12']);<br />         echo '<pre class="brush:php;toolbar:false">';<br />         print_r($stmt->fetchAll(PDO::FETCH_ASSOC));<br />         echo $stmt->rowCount();<br />    }<br />}<br />$db = DB::getInstance();<br />$db->Test();
ログイン後にコピー
PDO 自体はすでに適切にカプセル化されていると記述する必要があります。呼び出しコード
を単純化するためにさらにカプセル化が必要な場合は、PDO から DB クラス (
class DB extends PDO {<br />  private static $_Instance;<br />  function __construct() {<br />	$options = array(<br />		PDO::MYSQL_ATTR_INIT_COMMAND => "set names gbk",<br />		PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,<br />		PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,<br />		);<br /><br />    parent::__construct('mysql:dbname=test', 'root', '', $options);<br />  }<br />  //执行各种 sql 指令,并可通过参数 $param 进行扩展<br />  function query($sql, $param=null) {<br />	$res = [];<br />	try {<br />		$rs = parent::query($sql);<br />		do {<br />			if($t = $rs->fetchall()) $res[] = $t;<br />		}while($rs->nextRowset());<br />		return $res;<br />	} catch (PDOException $e) {<br />		die( "Error!: " . $e->getMessage() . "\n" );<br />		//  die();<br />	}<br />  }<br />  //查询并返回单条记录<br />  static function fetch($sql) {<br />	if(! self::$_Instance) self::$_Instance = new self;<br />	return self::$_Instance->query($sql)[0][0];//->fetch();<br />  }<br />  //查询并以数组方式返回多条记录<br />  static function fetchall($sql) {<br />	if(! self::$_Instance) self::$_Instance = new self;<br />	$res = self::$_Instance->query($sql);//->fetchall();<br />	if(count($res) == 1) return current($res);<br />  }<br />}<br />
ログイン後にコピー
など) を継承する必要があります。次のように使用する機会があります
$r = DB::fetch("select * from user where name='my'");

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート