加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

在PHP中访问单例方法

发布时间:2020-12-13 21:34:56 所属栏目:PHP教程 来源:网络整理
导读:我刚刚开始我的OOP之旅 – 我现在正在尝试推出自己的MVC – 纯粹是出于学习目的.我正在编写Apress PHP-Objects模式实践手册中的教程.我使用private __construct / __ clone技术创建了一个注册表单例对象: class Registry{ private static $instance; privat
我刚刚开始我的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;
      }
  }

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

Registry::getInstance();

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

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

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

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

解决方法

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

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

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

另一招:

将get()和set()映射到他们的魔术方法.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读