PHP 단일 모드 는 어떤 phop 이 단일 모드 를 실현 하 는 방법 입 니까?
1.의미
대상 의 생 성 모드 로 서 단일 모드 는 하나의 인 스 턴 스 만 있 고 자체 적 으로 예화 되 어 전체 시스템 에 이 인 스 턴 스 를 제공 합 니 다.인 스 턴 스 복사 본 을 만 들 지 않 고 단일 클래스 내부 에 저 장 된 인 스 턴 스 에 인용 을 되 돌려 줍 니 다.
2.단일 사례 모델 의 세 가지 요점:
(1).클래스 를 저장 하 는 유일한 인 스 턴 스 의 정적 구성원 변수 가 필요 합 니 다.
private static $_instance;
(2).구조 함수 와 복제 함 수 는 개인 적 인 것 으로 밝 혀 야 하 며 외부 프로그램 new 류 가 단일 모드 의 의 미 를 잃 지 않도록 해 야 합 니 다.
private function __construct()
{
$this->_db = pg_connect('xxxx');
}
private function __clone()
{
}// __clone() ,
(3).이 인 스 턴 스 에 접근 하 는 공공 정적 방법(보통 getInstance 방법)을 제공 하여 유일한 인 스 턴 스 의 인용 을 되 돌려 야 합 니 다.
public static function getInstance()
{
if(! (self::$_instance instanceof self) )
{
self::$_instance = new self();
}
return self::$_instance;
}
2.왜 단일 모드 를 사용 합 니까?1.PHP 의 단점:
PHP 언어 는 해석 형 스 크 립 트 언어 입 니 다.이 운영 체 제 는 모든 PHP 페이지 가 해석 되 고 실 행 된 후에 모든 관련 자원 을 회수 합 니 다.즉,PHP 는 언어 단계 에서 특정한 대상 을 메모리 에 상주 시 킬 방법 이 없다.이것 은 asp.net,자바 등 컴 파일 형 과 다르다.예 를 들 어 자바 에서 단일 사례 는 전체 응용 프로그램의 생명 주기 에 존재 하고 변 수 는 크로스 페이지 급 이 므 로 이 인 스 턴 스 가 응용 프로그램의 생명 주기 에서 유일 하 게 할 수 있다.그러나 PHP 에서 모든 변 수 는 전역 변수 든 클래스 의 정적 구성원 이 든 페이지 급 입 니 다.페이지 가 실 행 될 때마다 새로운 대상 을 다시 만 들 고 페이지 가 실 행 된 후에 비 워 집 니 다.그러면 PHP 단일 모드 는 의미 가 없 는 것 같 습 니 다.그래서 PHP 단일 모드 는 단일 페이지 급 요청 시 여러 개의 응용 장면 이 나타 나 고 같은 대상 자원 을 공유 해 야 할 때 매우 의미 가 있다 고 생각 합 니 다.
2.단일 모드 가 PHP 에서 의 응용 장소:
(1)응용 프로그램 과 데이터베이스 상호작용
하나의 응용 프로그램 에 대량의 데이터베이스 조작 이 존재 할 것 이다.예 를 들 어 데이터베이스 핸들 을 통 해 데이터 베 이 스 를 연결 하 는 행 위 는 단일 모드 를 사용 하면 대량의 new 작업 을 피 할 수 있다.왜냐하면 매번 new 작업 은 메모리 자원 과 시스템 자원 을 소모 하기 때문이다.
(2)제어 설정 정보
시스템 에 일부 설정 정 보 를 전역 적 으로 제어 할 수 있 는 클래스 가 필요 하 다 면 단일 모드 를 사용 하면 편리 하 게 실현 할 수 있 습 니 다.
3.어떻게 단일 모델 을 실현 합 니까?
1.일반적인 데이터베이스 접근 예:
<?php
......
//
$db = new DB(...);
//
$db->addUserInfo(...);
......
// ,
function getUserInfo()
{
$db = new DB(...);// new ,
$db = query(....);//
}
?>
2.단일 모드 를 사용 하여 데이터 베 이 스 를 조작 합 니 다.
<?php
class DB
{
private $_db;
private static $_instance;
private function __construct(...)
{
$this->_db = pg_connect(...);//postgrsql
}
private function __clone() {}; // __clone() ,
public static function getInstance()
{
if(! (self::$_instance instanceof self) ) {
self::$_instance = new self();
}
return self::$_instance;
}
public function addUserInfo(...)
{
}
public function getUserInfo(...)
{
}
}
//test
$db = DB::getInstance();
$db->addUserInfo(...);
$db->getUserInfo(...);
?>
다음 코드 는 PDO 작업 데이터베이스 클래스 의 패키지 로 단일 모드 를 사용 합 니 다.
<?php
/**
* MyPDO
*/
class MyPDO
{
protected static $_instance = null;
protected $dbName = '';
protected $dsn;
protected $dbh;
/**
*
*
* @return MyPDO
*/
private function __construct($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset)
{
try {
$this->dsn = 'mysql:host='.$dbHost.';dbname='.$dbName;
$this->dbh = new PDO($this->dsn, $dbUser, $dbPasswd);
$this->dbh->exec('SET character_set_connection='.$dbCharset.', character_set_results='.$dbCharset.', character_set_client=binary');
} catch (PDOException $e) {
$this->outputError($e->getMessage());
}
}
/**
*
*
*/
private function __clone() {}
/**
* Singleton instance
*
* @return Object
*/
public static function getInstance($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset)
{
if (self::$_instance === null) {
self::$_instance = new self($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset);
}
return self::$_instance;
}
/**
* Query
*
* @param String $strSql SQL
* @param String $queryMode (All or Row)
* @param Boolean $debug
* @return Array
*/
public function query($strSql, $queryMode = 'All', $debug = false)
{
if ($debug === true) $this->debug($strSql);
$recordset = $this->dbh->query($strSql);
$this->getPDOError();
if ($recordset) {
$recordset->setFetchMode(PDO::FETCH_ASSOC);
if ($queryMode == 'All') {
$result = $recordset->fetchAll();
} elseif ($queryMode == 'Row') {
$result = $recordset->fetch();
}
} else {
$result = null;
}
return $result;
}
/**
* Update
*
* @param String $table
* @param Array $arrayDataValue
* @param String $where
* @param Boolean $debug
* @return Int
*/
public function update($table, $arrayDataValue, $where = '', $debug = false)
{
$this->checkFields($table, $arrayDataValue);
if ($where) {
$strSql = '';
foreach ($arrayDataValue as $key => $value) {
$strSql .= ", `$key`='$value'";
}
$strSql = substr($strSql, 1);
$strSql = "UPDATE `$table` SET $strSql WHERE $where";
} else {
$strSql = "REPLACE INTO `$table` (`".implode('`,`', array_keys($arrayDataValue))."`) VALUES ('".implode("','", $arrayDataValue)."')";
}
if ($debug === true) $this->debug($strSql);
$result = $this->dbh->exec($strSql);
$this->getPDOError();
return $result;
}
/**
* Insert
*
* @param String $table
* @param Array $arrayDataValue
* @param Boolean $debug
* @return Int
*/
public function insert($table, $arrayDataValue, $debug = false)
{
$this->checkFields($table, $arrayDataValue);
$strSql = "INSERT INTO `$table` (`".implode('`,`', array_keys($arrayDataValue))."`) VALUES ('".implode("','", $arrayDataValue)."')";
if ($debug === true) $this->debug($strSql);
$result = $this->dbh->exec($strSql);
$this->getPDOError();
return $result;
}
/**
* Replace
*
* @param String $table
* @param Array $arrayDataValue
* @param Boolean $debug
* @return Int
*/
public function replace($table, $arrayDataValue, $debug = false)
{
$this->checkFields($table, $arrayDataValue);
$strSql = "REPLACE INTO `$table`(`".implode('`,`', array_keys($arrayDataValue))."`) VALUES ('".implode("','", $arrayDataValue)."')";
if ($debug === true) $this->debug($strSql);
$result = $this->dbh->exec($strSql);
$this->getPDOError();
return $result;
}
/**
* Delete
*
* @param String $table
* @param String $where
* @param Boolean $debug
* @return Int
*/
public function delete($table, $where = '', $debug = false)
{
if ($where == '') {
$this->outputError("'WHERE' is Null");
} else {
$strSql = "DELETE FROM `$table` WHERE $where";
if ($debug === true) $this->debug($strSql);
$result = $this->dbh->exec($strSql);
$this->getPDOError();
return $result;
}
}
/**
* execSql SQL
*
* @param String $strSql
* @param Boolean $debug
* @return Int
*/
public function execSql($strSql, $debug = false)
{
if ($debug === true) $this->debug($strSql);
$result = $this->dbh->exec($strSql);
$this->getPDOError();
return $result;
}
/**
*
*
* @param string $table
* @param string $field_name
* @param string $where
*/
public function getMaxValue($table, $field_name, $where = '', $debug = false)
{
$strSql = "SELECT MAX(".$field_name.") AS MAX_VALUE FROM $table";
if ($where != '') $strSql .= " WHERE $where";
if ($debug === true) $this->debug($strSql);
$arrTemp = $this->query($strSql, 'Row');
$maxValue = $arrTemp["MAX_VALUE"];
if ($maxValue == "" || $maxValue == null) {
$maxValue = 0;
}
return $maxValue;
}
/**
*
*
* @param string $table
* @param string $field_name
* @param string $where
* @param bool $debug
* @return int
*/
public function getCount($table, $field_name, $where = '', $debug = false)
{
$strSql = "SELECT COUNT($field_name) AS NUM FROM $table";
if ($where != '') $strSql .= " WHERE $where";
if ($debug === true) $this->debug($strSql);
$arrTemp = $this->query($strSql, 'Row');
return $arrTemp['NUM'];
}
/**
*
*
* @param String $dbName
* @param String $tableName
* @param Boolean $debug
* @return String
*/
public function getTableEngine($dbName, $tableName)
{
$strSql = "SHOW TABLE STATUS FROM $dbName WHERE Name='".$tableName."'";
$arrayTableInfo = $this->query($strSql);
$this->getPDOError();
return $arrayTableInfo[0]['Engine'];
}
/**
* beginTransaction
*/
private function beginTransaction()
{
$this->dbh->beginTransaction();
}
/**
* commit
*/
private function commit()
{
$this->dbh->commit();
}
/**
* rollback
*/
private function rollback()
{
$this->dbh->rollback();
}
/**
* transaction SQL
* getTableEngine
*
* @param array $arraySql
* @return Boolean
*/
public function execTransaction($arraySql)
{
$retval = 1;
$this->beginTransaction();
foreach ($arraySql as $strSql) {
if ($this->execSql($strSql) == 0) $retval = 0;
}
if ($retval == 0) {
$this->rollback();
return false;
} else {
$this->commit();
return true;
}
}
/**
* checkFields
*
* @param String $table
* @param array $arrayField
*/
private function checkFields($table, $arrayFields)
{
$fields = $this->getFields($table);
foreach ($arrayFields as $key => $value) {
if (!in_array($key, $fields)) {
$this->outputError("Unknown column `$key` in field list.");
}
}
}
/**
* getFields
*
* @param String $table
* @return array
*/
private function getFields($table)
{
$fields = array();
$recordset = $this->dbh->query("SHOW COLUMNS FROM $table");
$this->getPDOError();
$recordset->setFetchMode(PDO::FETCH_ASSOC);
$result = $recordset->fetchAll();
foreach ($result as $rows) {
$fields[] = $rows['Field'];
}
return $fields;
}
/**
* getPDOError PDO
*/
private function getPDOError()
{
if ($this->dbh->errorCode() != '00000') {
$arrayError = $this->dbh->errorInfo();
$this->outputError($arrayError[2]);
}
}
/**
* debug
*
* @param mixed $debuginfo
*/
private function debug($debuginfo)
{
var_dump($debuginfo);
exit();
}
/**
*
*
* @param String $strErrMsg
*/
private function outputError($strErrMsg)
{
throw new Exception('MySQL Error: '.$strErrMsg);
}
/**
* destruct
*/
public function destruct()
{
$this->dbh = null;
}
}
?>
호출 방법:
<?php
require 'MyPDO.class.php';
$db = MyPDO::getInstance('localhost', 'root', '123456', 'test', 'utf8');
$db->query("select count(*) frome table");
$db->destruct();
?>
이상 은 본 고의 모든 내용 이 므 로 여러분 이 phop 프로 그래 밍 을 배 우 는 데 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.