php - 在 PHP 中访问单例方法

标签 php oop static singleton methods

我刚刚开始我的 OOP 之旅 - 我目前正在尝试推出我自己的 MVC - 纯粹出于学习目的。我正在学习 Apress PHP-Objects Patterns Practice 书中的一个教程。我使用私有(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();

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

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

我收到一个解析错误。我只能使用范围解析运算符访问方法 - 即“::”。

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

最佳答案

Registry::getInstance() 返回类 Registry 的一个(实际上是唯一的)实例。它与 new 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;

关于php - 在 PHP 中访问单例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1221258/

相关文章:

php - 结果显示在 phpmyadmin 中,而不显示在浏览器中

php - Visual Studio Code,HTML 标记未在 PHP 文件中配对和突出显示

c - 声明说明符和声明符

qt5 : how to create and display custom qdialog from static function within a qthread

php - mysql php做循环的方法

php - 当结果返回仅为 1 个值时,如何将从 SELECT 语句检索到的值设置为变量

java - 构造函数和零参数构造函数的区别(Java)

java - 为什么 MDB 类不能是最终的

c++ - 指针引用模式 - 常用?

c++ - constexpr 静态成员变量的链接器错误