Я довольно новичок в классическом наследовании, поскольку в основном я занимаюсь ECMAScript и Python, хотя я делаю честный (содрогающийся) PHP. Я знаю, что это сильно зависит от Java и других классических языков, основанных на наследовании.
Вопрос:
Я заглянул в несколько классов в рамки и заметил, что ключевое слово «новое» не было вызвано (по крайней мере) для создания экземпляра, но для создания начального объекта был использован метод getInstance public.
Может ли кто-нибудь объяснить стратегию этого? И когда я должен использовать его для своих классов?
Соответствующий код:
class FrontController { public static $_instance; public static function getInstance() { if ( !(self::$_instance instanceof self) ) { self::$_instance = new self(); } return self::$_instance; } } $front = FrontController::getInstance(); $front->route(); echo $front->getBody();
Полный код:
class FrontController { protected $_controller, $_action, $_params, $_body, $_url; public static $_instance; public static function getInstance() { if ( ! ( self::$_instance instanceof self) ) { self::$_instance = new self(); } return self::$_instance; } private function __construct() { $this->uri = uri::getInstance(); if ( $this->uri->fragment(0) ) { $this->_controller = $this->uri->fragment(0).'Controller'; } else { $config = config::getInstance(); $default = $config->config_values['application']['default_controller'].'Controller'; $this->_controller = $default; } if ( $this->uri->fragment(1) ) { $this->_action = $this->_uri->fragment(1); } else { $this->_action = 'index'; } } public function route() { $con = $this->getController(); $rc = new ReflectionClass( $con ); if ( $rc->implementsInterface( 'IController' ) ) { $controller = $rc->newInstance(); if ( $rc->hasMethod( $this->getAction() ) ) { $method = $rc->getMethod( $this->getAction() ); } else { $config = config::getInstance(); $default = $config->config_values['application']['default_action']; $method = $rc->getMethod( $default ); } $method->invoke( $controller ); } else { throw new Exception('Interface iController must be implemented'); } } public function getController() { if ( class_exists( $this->_controller ) ) { return $this->_controller; } else { $config = config::getInstance(); $default = $config->config_values['application']['error_controller'].'Controller'; return $default; } } public function getAction() { return $this->_action; } public function getBody() { return $this->_body; } public function setBody( $body ) { $this->_body = $body; } }
Это довольно просто. Выглядит, как думает Zend Framework?
Во всяком случае, это реализует шаблон дизайна Singleton. Это запрещает программисту создавать несколько экземпляров контроллера. Итак, вы получаете доступ к контроллеру из любого места в своем коде, вместо создания нового FrontController или чего-то подобного просто попросите дать экземпляр One, который был ранее создан.
Если ни один экземпляр не существует, он создает еще один, он возвращает вам только тот контроллер, который был ранее создан.
Надеюсь, это поможет вам!
getInstance()
происходит из шаблона Singleton . В основном вы используете это, когда хотите создать экземпляр не более одного экземпляра класса.