-
- private static $_instance;
コードをコピー
2)、コンストラクターとクローン関数は、外部プログラムが新しいクラスから取得され、シングルトン モードの意味が失われるのを防ぐために、プライベートとして宣言する必要があります。
-
- プライベート関数 __construct()
- {
- $this->_db = pg_connect('xxxx');
- }
- プライベート関数 __clone()
- {
- }//__clone() メソッドをオーバーライドします。クローンは禁止されています
コードをコピーします
(3)。このインスタンスにアクセスするにはパブリック静的メソッド (通常は getInstance メソッド) を提供する必要があります。これにより、一意のインスタンスへの参照が返されます。
-
- パブリック静的関数 getInstance()
- {
- if(! (self::$_instance instanceof self) )
- {
- self::$_instance = new self() }
- return self::$; _instance;
- }
-
コードをコピー
2. PHP デザイン パターンのシングルトン モードを使用する必要があるのはなぜですか?
1. PHP の欠点:
PHP 言語は解釈されたスクリプト言語です。この動作メカニズムにより、各 PHP ページが解釈されて実行された後、関連するすべてのリソースが確実にリサイクルされます。言い換えれば、PHP には言語レベルでオブジェクトをメモリに常駐させる方法がありません。これは、たとえば Java では、ライフサイクル全体を通じて常に存在します。変数はページ間レベルであり、アプリケーションのライフサイクル内でこのインスタンスを真に一意にすることができます。ただし、PHP では、グローバル変数であろうとクラスの静的メンバーであろうと、すべての変数はページ レベルであり、ページが実行されるたびに新しいオブジェクトが再確立され、ページの実行後にクリアされます。 PHP のシングルトン モードは意味がないようなので、単一のページ レベルのリクエストで複数のアプリケーション シナリオが発生し、同じオブジェクト リソースを共有する必要がある場合にのみ、PHP シングルトン モードが非常に意味があると思います。
2. PHP でのシングルトン モードの適用場面:
1) アプリケーションとデータベース間の対話
アプリケーションでは、データベース ハンドルを介してデータベースに接続するなど、多数のデータベース操作が行われます。これは、新しい操作のたびにメモリ リソースとシステム リソースが消費されるため、シングルトン モードを使用すると、大量の新しい操作を回避できます。 。
2)、制御構成情報
特定の構成情報をグローバルに制御するためにシステム内でクラスが必要な場合は、シングルトン パターンを使用して簡単に実装できます。
3. シングルトンモードを実装するには?
1. 一般的なデータベースアクセスの例:
- ......
- //データベースハンドルを初期化します
- $db = new DB(...);
-
- //ユーザー情報を追加します
- $db->addUserInfo (...);
-
- ......
-
- //関数内でデータベースにアクセスしてユーザー情報を検索する
- function getUserInfo()
- {
- $db = new DB(...);//new再びデータベースクラス、データベースとの接続を確立します
- $db = query(....);//クエリステートメントに従ってデータベースにアクセスします
- }
- ?>
-
コードをコピーします
2.データベースを操作するシングルトン モード:
クラス DB - {
- private static $_instance;
-
- private function __construct(...)
- {
- $this->_db = pg_connect(.. .);//postgrsql
- }
-
- private function __clone() {}; //__clone() メソッドをオーバーライドし、クローン作成を禁止します
-
- public static function getInstance()
- {
- if(! (self::$_instanceinstanceof) self) ) {
- self::$_instance = new self();
- }
- return self::$_instance;
- }
- public function addUserInfo(...)
- {
- }
-
- public function getUserInfo(... )
- {
- }
- }
-
- //テスト
- $db = DB::getInstance();
- $db->addUserInfo(...);
- $db->getUserInfo(...); ?>
-
-
- コードをコピー
-
3. 深い理解
-
- /**
- データベース操作クラス
- @link http://bbs.it-home.org
- */
- class db {
- public $conn;
- パブリック静的 $sql;
- パブリック静的 $instance=null;
- プライベート関数 __construct(){
- require_once('db.config.php');
- $this->conn = mysql_connect($db['host'],$db['user'],$db['password']);
- if(!mysql_select_db($db['database'],$this->conn)){
- echo "失败";
- };
- mysql_query('set names utf8',$this->conn);
- }
- public static function getInstance(){
- if(is_null(self::$instance)){
- self::$instance = 新しいデータベース;
- }
- self::$instance を返します。
- }
- /**
- * データベースにクエリを実行する
- */
- public function select($table,$condition=array(),$field = array()){
- $where='';
- if(!emptyempty($condition)){
-
- foreach($condition as $k=>$v){
- $where.=$k."='".$v."' および ";
- }
- $where='where '.$where .'1=1';
- }
- $fieldstr = '';
- if(!emptyempty($field)){
-
- foreach($field as $k=>$v){
- $fieldstr.= $v.',';
- }
- $fieldstr = rtrim($fieldstr,',');
- }else{
- $fieldstr = '*';
- }
- self::$sql = "{$table} {$where} から {$fieldstr} を選択します";
- $result=mysql_query(self::$sql,$this->conn);
- $resuleRow = array();
- $i = 0;
- while($row=mysql_fetch_assoc($result)){
- foreach($row as $k=>$v){
- $resuleRow[$i][$k] = $v;
- }
- $i++;
- }
- $resuleRow を返します。
- }
- /**
- * レコードを追加します
- */
- public function insert($table,$data){
- $values = '';
- $datas = '';
- foreach($data as $k=>$v){
- $values.=$k.',';
- $datas.="'$v'".',';
- }
- $values = rtrim($values,',');
- $datas = rtrim($datas,',');
- self::$sql = "{$table} ({$values}) の値 ({$datas}) に挿入";
- if(mysql_query(self::$sql)){
- return mysql_insert_id();
- }else{
- false を返します。
- };
- }
- /**
- * レコードを変更する
- */
- public function update($table,$data,$condition=array()){
- $where='';
- if(!emptyempty($condition)){
-
- foreach($condition as $k=>$v){
- $where.=$k."='".$v."' および ";
- }
- $where='where '.$where .'1=1';
- }
- $updatastr = '';
- if(!emptyempty($data)){
- foreach($data as $k=>$v){
- $updatastr.= $k."='".$v."',";
- }
- $updatastr = 'set '.rtrim($updatastr,',');
- }
- self::$sql = "更新 {$table} {$updatastr} {$where}";
- return mysql_query(self::$sql);
- }
- /**
- * 記録を削除します
- */
- public function delete($table,$condition){
- $where='';
- if(!emptyempty($condition)){
-
- foreach($condition as $k=>$v){
- $where.=$k."='".$v."' および ";
- }
- $where='where '.$where .'1=1';
- }
- self::$sql = "{$table} {$where} から削除";
- return mysql_query(self::$sql);
-
- }
-
- public static function getLastSql(){
- echo self::$sql;
- }
- }
-
- $db = db::getInstance();
- //$list = $db->select('demo',array('name'=>'tom','password'=>'ds'),array('name','password') );
- //echo $db->insert('demo',array('name'=>'最近你啦','password'=>'123'));
- //echo $db->update('demo',array("name"=>'xxx',"password"=>'123'),array('id'=>1));
- echo $db->delete('demo',array('id'=>'2'));
- db::getLastSql();
- echo "
";
- ?>
复制代
|