《深入php面向对象,模式与实践》中指出:全局变量是面向对象程序员遇到的引发bug的主要原因之一,这是因为全局变量将类捆绑在特定的环境中,破坏了封装。然而,为了能够使所有类够能够访问到某个对象,会不惜忍受全局访问的缺陷。
总结来说,不使用全局变量,又想要使得每个类都能访问到对象。问题的关键点即:
1.对象应该被系统中的任何对象使用。
2.对象不应该被存储在会被复写的全局变量中。
3.系统中不应该出现超过一个的该变量。
为了解决这个方案,可以使用单例模式。
单例模式的实现思想是:将类的构造函数设置为private权限,同时采用一个静态方法和静态属性来间接实例化对象。
class singleton{ private static $instance = NULL; private $props = array(); private function __construct(){ } public static function getInstance(){ if(empty(SELF::$instance)){ SELF::$instance = new SELF(); } return self::$instance; } public function setProp($prop,$value){ $this->props[$prop] = $value; } public function getProp($prop){ return $this->props[$prop]; } private function __set($prop,$value){ //省略之 } private function __get(){ //省略 } private function __clone(){ //省略 } }
单例模式的UML图示如下: