우선 몇 가지 개념을 인용해 보겠습니다.
팩토리 패턴: 다른 클래스의 인스턴스 생성을 담당하는 클래스를 구체적으로 정의합니다. 생성된 인스턴스는 일반적으로 동일한 상위 클래스를 갖습니다. 팩토리 패턴은 일반적으로 다양한 독립 변수를 기반으로 다양한 클래스의 인스턴스를 반환하는 클래스 생성 패턴입니다.
팩토리 패턴의 핵심은 팩토리 클래스가 수신 매개변수를 기반으로 어떤 제품 인스턴스를 생성해야 하는지 동적으로 결정한다는 것입니다. 팩토리 패턴에는 팩토리 역할, 추상 제품 역할 및 특정 제품 역할이 포함됩니다.
팩토리(Creator) 역할: 팩토리 패턴의 핵심으로 모든 인스턴스를 생성하는 내부 로직을 구현하는 역할을 담당합니다. 필요한 제품 객체를 생성하기 위해 외부 세계에서 팩토리 클래스를 직접 호출할 수 있습니다.
추상 제품(Product) 역할: 팩토리 패턴으로 생성된 모든 객체의 상위 클래스입니다. 모든 인스턴스에 공통적인 공용 인터페이스를 설명하는 역할을 담당합니다.
Concrete Product 역할: 팩토리 패턴의 생성 대상입니다. 모든 객체는 이 역할을 수행하는 특정 클래스의 인스턴스입니다.
ZF의 zend_db는 팩토리 패턴의 좋은 예입니다.
다음에 분석이 시작됩니다. . . . . .
zf를 구성할 때 Bootstrap.php 파일에 데이터베이스 연결 작업 정보를 넣을 수 있습니다.
<?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { function __construct($app){ parent::__construct($app); $url=constant('APPLICATION_PATH').DIRECTORY_SEPARATOR.'configs'.DIRECTORY_SEPARATOR.'config.ini'; $dbconfig=new Zend_Config_Ini($url,null,true); $db=Zend_Db::factory($dbconfig->general->db->adapter,$dbconfig->general->db->params->toArray()); // var_dump($db); $db->query('SET NAMES UTF8'); Zend_Db_Table::setDefaultAdapter($db); } } ?>
항목 파일에서 Bootstrap과 유사한 Zend_Application 객체를 통해 bootstrap()을 호출합니다. 생성자는 호출됩니다.
생성자에서 Zend_Db::factory()를 통해 데이터베이스 운영을 위한 객체 인스턴스를 얻을 수 있습니다.
Zend_Config_Ini 인스턴스를 통해 config.ini의 관련 정보를 읽고 이를 팩토리 함수 Zend_Db::factory()에 매개변수로 전달합니다.
Configuration.ini 정보
[general]
db.adapter =PDO_MYSQL
db.params.host =localhost
db.params.username =root
db.params.password =
db.params.dbname = 데이터베이스 이름
Zend_Db::factory( )
매개변수 1 : PDO_MYSQL 등 운용할 데이터베이스 타입
매개변수 2 : 서버명, 사용자 이름, 비밀번호, 접속할 데이터베이스 등 데이터베이스에 접속하기 위한 정보
먼저 두 가지 질문을 던집니다.
①운영하려는 데이터베이스가 MSSQL인 경우 어떻게 해야 합니까?
②여기서 Zend_Db::factory()를 사용한다면 어떻게 될까요? 해야 할까요?
답변:
① config.ini 파일에서 PDO_MYSQL을 PDO_MSSQL로 수정하기만 하면 됩니다.
② 데이터베이스를 기존 방식으로 운영하기 위한 객체 인스턴스를 생성합니다.
$db=new Zend_Db_Adapter_Pdo_Mysql($ config)
그 중: $config 정보를 config.ini에서 읽어옵니다.
문제는: 전통적인 방법으로 객체 인스턴스를 생성한다면 이를 결정하는 프로세스가 있어야 한다는 것입니다. 운영할 데이터베이스의 종류?
예:
switch ($dbType){ case 'PDO_MYSQL': .... case 'PDO_MSSQL': .... case 'PDO_SQLITE': .... }
데이터베이스 유형에 따라 데이터베이스를 작동하려면 서로 다른 문을 작성해야 합니다.
그런데 이 모든 작업에서 zf는 다음을 사용합니다. 공장 모드는 우리를 위해 수행되었으며 사용하기 매우 편리합니다.
Zf에서 공장 모드를 구현하는 방법은 무엇입니까?
먼저 추상 기본 클래스인 Zend_Db_Adapter_Abstract가 있어야 합니다. 이 클래스는 팩토리 패턴에 의해 생성된 모든 객체의 상위 클래스이며 모든 인스턴스에 공통적인 인터페이스를 제공하는 역할을 담당합니다.
이 클래스는 선택, 업데이트, 삽입, 삭제, 쿼리, fetchRow, fetchAssoc 등 데이터베이스 운영에 매우 익숙한 일부 구현 메서드를 제공할 뿐만 아니라 하위 클래스 구현을 위한 일부 인터페이스도 제공합니다. 예:limit, getServerVersion, closeConnection, explainTable 등
abstract class Zend_Db_Adapter_Abstract { //.. } abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract { //.. } class Zend_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Abstract { //...实现针对Mysql数据库的操作 } class Zend_Db_Adapter_Pdo_Mssql extends Zend_Db_Adapter_Pdo_Abstract { //....实现针对Mssql数据库的操作 } class Zend_Db_Adapter_Pdo_Sqlite extends Zend_Db_Adapter_Pdo_Abstract { //....实现针对Sqlite数据库的操作 }
위의 관계는 그림으로 간단히 표현 가능합니다
다음, 해보자 Zend_Db::Factory()가 다양한 매개변수를 기반으로 다양한 데이터베이스를 선택하는 방법을 추적하세요.
Zend Framework의 팩토리 패턴 적용에 대한 더 많은 글은 PHP 중국어 홈페이지를 참고해주세요!