我刚刚开始我的 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/