Я довольно новичок в классическом наследовании, так как я в основном имею дело с ECMAScript и Python, хотя я довольно много (дрожу) PHP. Я знаю, что это сильно зависит от Java и других языков, основанных на классическом наследовании.
Вопрос:
Я взглянул на несколько классов в рамках и заметил, что ключевое слово 'new' не вызывалось (по крайней мере, напрямую) для создания экземпляра, но для создания исходного объекта использовался публичный метод getInstance.
Может кто-нибудь объяснить стратегию этого? И когда я должен использовать это для своих собственных классов?
Соответствующий код:
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;
}
}