PHP tekil yöntemlerden erişme

3 Cevap php

Ben sadece OOP içine benim yolculuk kuruyorum - ve ben şu anda benim kendi MVC rulo çalışıyorum - sadece öğrenme amaçlı. Ben Apress bir öğretici ile çalışıyorum Desenler Uygulama Kitabı PHP-Objects. Ben özel __ construct / __clone tekniği kullanarak bir kayıt defteri tek nesne yarattık:

class Registry
{
  private static $instance;
  private $values = array();


  private function __construct(){}
  private function __clone(){}

  public static function getInstance(){
       if( !isset( self::$instance ) ){
         self::$instance = new Registry();
         }
       return self::$instance;
       }

  public function get( $key ) {
      if ( isset( $this->values[$key] ) ) {
          return $this->values[$key];
          }
      return null;
      }

  public function set( $key, $val ) {
      $this->values[$key] = $val;
      }
  }

Ben doğrudan yani bu nesnenin bir örneğini almak:

Registry::getInstance();

Ancak, (öğretici sözdizimi aşağıdaki) - Ben denemek ve kullanan kamu yöntemleri erişim eğer '->' yöntemi - örn:

Registry->setVal('page',$page);

Ben bir ayrıştırma hatası alıyorum. Yani '::' - Ben sadece kapsam çözünürlük operatörü kullanılarak yöntemleri erişebilirsiniz.

Ben nesne sarıcı instantiated olmamıştır çünkü bu olduğunu varsayarak yaşıyorum - ama sadece Sizle bu konuyu görüşmek / doğrulamak istiyorum ...

3 Cevap

Registry::getInstance() sınıfı (aslında tek) bir örneğini verir Registry. Bu, new Registry() olarak aynı dönüş değeri sadece orada olacak bütün uygulamanızda yalnızca bir örnek olabilir. Bu yöntemleri erişmek için olasılık vardır:

// #1
$registry = Registry::getInstance();
$registry->set($key, $value);

// #2
Registry::getInstance()->set($key, $value);

Başka bir hile:

Harita get() ve set() onların sihirli yöntemler ile ilgilidir.

public function __set($key, $value)
{
    return $this->set($key, $value);
}

public function __get($key)
{
    return $this->get($key);
}

Yani birini kullanabilirsiniz Registry::getInstance()->set($key, $value); veya Registry::getInstance()->$key = $value; olabilir

Sen sınıf kendisi, bir örnek SETVAL () değil aramak gerekir, bu nedenle bu yapabilirdi:

Registry::getInstance()->set('page', $page);

Başka bir alternatif sınıfta nesne oluşturma koymak yerine, her kullanımında başvurmak zorunda olduğunu:

public static function get( $key ) {
    $instance = self::getInstance();
    if ( isset( $instance->values[$key] ) ) {
        return $instance->values[$key];
    }
    return null;
}

Ve sadece Registry::set('page', $page); ile çağrı

Yapmanız bu şekilde bir tekil hala bir uyarı işareti (iyi ipliğin bir ton Eğer arama varsa, neden üzerinde stackoverflow zaten orada) düşünülmelidir olsa da, kullanılan biraz daha güzel bir kod olsun.