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)
我得到一个解析错误.我只能使用范围解析运算符访问方法 - 即'::'.
我假设这是因为对象包装器尚未实例化 - 但我只是想与你们一起验证/讨论这个问题...
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;