Sınıf Menşei / Açıklama :: getInstance?

1 Cevap php

Ben esas ECMAScript ve Python ile uğraşmak gibi (titreme) PHP adil düşeni yapmak olsa ben, klasik miras oldukça yeniyim. Ben ağır Java ve diğer klasik miras tabanlı dillerde etkilenmiştir biliyorum.

Soru:

Ben bir çerçevede birkaç sınıfları bir göz alarak ve 'yeni' anahtar kelime bir örneğini oluşturmak için (en azından doğrudan) denilen olmadığını fark ettim, ama kamu getInstance yöntemi ilk nesne oluşturmak için kullanılan edildi.

Birisi bu arkasındaki stratejiyi açıklayabilir misiniz? Ve benim kendi sınıfları için kullanmak gerekir?

İlgili Kod:

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();

Tam Kodu:

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;
    }
}

1 Cevap

getInstance() Singleton pattern gelmektedir. Bir sınıfın en fazla bir örneğini istediğinizde temelde bu kullanabilirsiniz.