-
- private static $_instance
코드 복사
2) 생성자 및 복제 함수를 선언해야 합니다. 외부 프로그램이 새 클래스를 추가하여 싱글톤 모드의 의미를 잃는 것을 방지하는 것은 비공개입니다.
-
- 비공개 함수 __construct()
- {
- $this->_db = pg_connect('xxxx')
- }
- private function __clone()
- {
- }//__clone() 메서드를 재정의하고 복제를 금지합니다
코드 복사
(3). 이 인스턴스에 액세스하기 위한 공용 정적 메서드(일반적으로 getInstance 메서드)를 제공하여 고유한 인스턴스에 대한 참조를 반환합니다.
-
- 공용 정적 함수 getInstance()
- {
- if(! (self::$_instance instanceof self) )
- {
- self::$_instance = new self();
- }
- return self::$_instance;
- }
코드 복사
2. PHP 디자인 패턴의 싱글톤 모드를 사용하는 이유는 무엇입니까?
1. PHP의 단점:
PHP 언어는 해석된 스크립팅 언어입니다. 이 운영 메커니즘은 각 PHP 페이지가 해석되고 실행된 후 모든 관련 리소스가 재활용되도록 합니다. 즉, PHP는 언어 수준에서 객체를 메모리에 상주시킬 수 있는 방법이 없습니다. 이는 asp.net 및 Java와 같은 컴파일된 유형과 다릅니다. 예를 들어 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 $_db;
- private static $_instance; 🎜> 개인 함수 __construct(...)
- {
- $this->_db = pg_connect(...);//postgrsql
- }
-
- 개인 함수 __clone() { }; //__clone() 메서드를 재정의하고 복제를 금지합니다
-
- public static function getInstance()
- {
- if(! (self::$_instance instanceof self) ) {
- self ::$_instance = new self();
- }
- return self::$_instance;
- }
- 공개 함수 addUserInfo(...)
- {
- }
-
- 공개 함수 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);
- }
- 공개 정적 함수 getInstance(){
- if(is_null(self::$instance)){
- self::$instance = new db;
- }
- return self::$instance;
- }
- /**
- * 데이터베이스 쿼리
- */
- 공개 함수 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 = 배열();
- $i = 0;
- while($row=mysql_fetch_assoc($result)){
- foreach($row as $k=>$v){
- $resuleRow[$i][$k] = $v;
- }
- $i ;
- }
- $resuleRow를 반환합니다.
- }
- /**
- * 기록 추가
- */
- 공용 함수 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를 반환합니다.
- };
- }
- /**
- * 기록 수정
- */
- 공개 함수 업데이트($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);
- }
- /**
- * 기록 삭제
- */
- 공개 함수 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 "
";
- ?>
复代码
|