Происхождение / Объяснение класса :: getInstance? - PullRequest
3 голосов
/ 19 сентября 2009

Я довольно новичок в классическом наследовании, так как я в основном имею дело с 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;
    }
}

Ответы [ 2 ]

14 голосов
/ 20 сентября 2009

Это довольно просто. Похоже, очень похоже на мысль Zend Framework?
В любом случае, это реализует шаблон проектирования Singleton. Программисту запрещается создавать более одного экземпляра контроллера. Таким образом, если вы обращаетесь к своему контроллеру из любого места в вашем коде, вместо того, чтобы создавать новый FrontController или что-то в этом роде, вы просто запрашиваете экземпляр One, который был ранее создан.

Если ни одного экземпляра не существует, он создает другой, он возвращает вам только фронт-контроллер, который был создан ранее.


Надеюсь, это поможет вам!

4 голосов
/ 19 сентября 2009

getInstance() происходит от Singleton pattern . Вы в основном используете это, когда хотите создать не более одного экземпляра класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...