使用PHP5的Sinlgeton设计模式
单例设计模式用于在应用程序中集中对象,该应用程序用于存储更改的变量,然后程序的其他部分可以访问这些变量。它仅允许对象的单个实例化,因此也可以命名。
单例的主要用途是创建使用全局变量的替代方法。尽管全局变量很有用,但是如果您碰巧分配了两个具有相同名称的变量,它们可能会导致严重的问题,但是PHP不会产生任何错误,并且您的程序将开始表现异常。在小型程序中,这可能不是问题,但是在大型系统中,全局变量冲突非常容易。
单例模式通过使用单个对象来解决此问题,该对象可被需要它的程序的任何部分访问。如果使用相同的名称声明了两个类,则PHP会引发错误,因此,如果程序的另一部分尝试使用相同的类名称,您将了解它。
单例的另一个用途是在整个系统中协调动作。如果系统的两个部分使用相同的对象,则可以使用单例停止系统的不同部分来创建单独的对象。使用单例时,只会创建一个对象。
创建单例的第一步是按通常的形式创建类,但将构造函数设为私有。这意味着不可能直接实例化该类。接下来,我们设置一个静态变量和一个静态函数,它们的静态性质意味着即使未实例化对象也可以使用它们。
静态变量用于存储对象的实例。调用静态函数时,它将检查对象是否包含在静态变量中,如果是,则返回该对象,如果没有,则创建并返回一个新对象。这是一些可用于存储单个首选项的类的示例代码。
class Preferences { private $property; public static $instance; private function __construct() { } public static function getInstance(){ if (empty(self::$instance)) { self::$instance = new Preferences(); } return self::$instance; } public function setProperty($value) { $this->property = $value; } public function getProperty() { return $this->property; } }
此类以以下方式使用。
$pref = Preferences::getInstance(); $pref->setProperty("nothing");
一种更有用的类是将许多不同类型的属性存储为数组的类。
class Preferences { private $property = array(); public static $instance; private function __construct() { } public static function getInstance() { if (empty(self::$instance)) { self::$instance = new Preferences(); } return self::$instance; } public function setProperty($key, $value) { $this->property[$key] = $value; } public function getProperty($key) { return $this->property[$key]; } }
以下列方式使用。
$pref = Preferences::getInstance(); $pref->setProperty("property1", "nothing");
由于在对象中使用了get和set方法,因此无法使用错误的数据类型覆盖Singletons,从而为标准全局变量提供了进一步的保护。
在您所做的所有事情中都非常容易使用单例模式,但是只有在您真正需要它时才应使用它。如果您的程序出了问题,由于难以跟踪具有单例的系统构建中的关系,您可能很难找出原因。