几个关键点:
1,对象P应该可以被系统中的任何对象使用
2,对象P不应该被存储在会被覆写的全局变量总
3,系统中不应该超过一个P对象,也就是说,Y对象可以设置P对象的一个属性,而Z对象不需要通过其他对象(假如Y和Z都可以访问P对象)就可以直接获得该属性的值
实现:
下面创建了一个无法从其自身外部来创建实例的类,听起来有些难,其实只要简单的定义一个私有的构造方法即可:
<?php class P{ private $props=array(); private function __construct(){} public function setProperty($key,$val){ $this->props[$key] = $val; } public function getProperty($key){ return $this->props[$key]; } }
上面的类,由于构造方法被设置为私有,客户端代码无法实例化对象。因此setProperty和getProperty方法目前也是多余的。
不过我们可以使用静态方法和静态熟悉来实例化对象:
<?php class P{ private $props=array(); private static $instance; public static function getInstance(){ if(empty(self::$instance)){ self::$instance = new P(); } return self::$instance; } private function __construct(){} public function setProperty($key,$val){ $this->props[$key] = $val; } public function getProperty($key){ return $this->props[$key]; } } $pref = P::getInstance(); $pref->setProperty("name","mattttttt"); var_dump($pref); unset($pref);//移除引用 $pref2 = P::getInstance(); var_dump($pref2); $pref2->setProperty("name","masssssssssssss"); var_dump($pref2); print $pref2->getProperty("name");//该属性值并没有丢失 //输出 matttttttt