在PHP中访问单例方法

sun*_*ung 3 php oop methods singleton static

我刚刚开始我的OOP之旅 - 我现在正在尝试推出自己的MVC - 纯粹是出于学习目的.我正在编写Apress PHP-Objects模式实践手册中的教程.我使用private __construct/__ clone技术创建了一个注册表单例对象:

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;
      }
  }
Run Code Online (Sandbox Code Playgroud)

我直接获得了这个对象的实例,即:

Registry::getInstance();
Run Code Online (Sandbox Code Playgroud)

但是,(遵循教程中的语法) - 如果我尝试使用' - >'方法访问公共方法 - 例如:

Registry->setVal('page',$page);
Run Code Online (Sandbox Code Playgroud)

我得到一个解析错误.我只能使用范围解析运算符访问方法 - 即'::'.

我假设这是因为对象包装器尚未实例化 - 但我只是想与你们一起验证/讨论这个问题...

Phi*_*ber 7

Registry::getInstance()返回类的一个(实际上是唯一的)实例Registry.它具有相同的返回值new Registry(),只是在整个应用程序中只能有一个实例.这些是您访问方法的可能性:

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

// #2
Registry::getInstance()->set($key, $value);
Run Code Online (Sandbox Code Playgroud)

另一招:

地图get()set()他们的魔法.

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

public function __get($key)
{
    return $this->get($key);
}
Run Code Online (Sandbox Code Playgroud)

所以你可以使用Registry::getInstance()->set($key, $value);Registry::getInstance()->$key = $value;