PHP类参考
要明确的是,我不想多次实例化同一个类。我只想实例化它一次,并通过一些引用跟踪对该实例所做的任何更改。这可能吗?如果可能,如何做到?谢谢 您可以创建单例模式PHP类参考,php,class,object,reference,Php,Class,Object,Reference,要明确的是,我不想多次实例化同一个类。我只想实例化它一次,并通过一些引用跟踪对该实例所做的任何更改。这可能吗?如果可能,如何做到?谢谢 您可以创建单例模式 class Something { private static $instance; private function __construct() { } public static function getInstance() { if(Something::$instance
class Something {
private static $instance;
private function __construct() {
}
public static function getInstance() {
if(Something::$instance == null) {
Something::$instance = new Something();
}
return Something::$instance;
}
public function someMethod() {
return "abc";
}
}
当您想使用它时,可以调用Something::getInstance()->somethod()
阅读更多关于单例模式的信息。您尝试的是单例模式。。请参见,您可以使用。有一个很好的示例和说明: Singleton确保一个类只能有一个实例,并提供该实例的全局访问点 类别:
<?php
class Example
{
private static $instance;
private function __construct() {
}
public static function singleton() {
if (!isset(self::$instance)) {
echo 'Creating new instance.';
$className = __CLASS__;
self::$instance = new $className;
}
return self::$instance;
}
public function __clone() {
trigger_error('Clone is not allowed.', E_USER_ERROR);
}
public function __wakeup() {
trigger_error('Unserializing is not allowed.', E_USER_ERROR);
}
}
还值得注意的是,PHP手册中对singleton模式的这些反对意见:
单例模式是比较有争议的模式之一。批评者认为
单例将全局状态引入应用程序,并将
将Singleton和它的消费类结合起来。这导致了隐藏的
依赖关系和意外的副作用,这反过来又会导致代码错误
这更难测试和维护
批评家们进一步认为,在一个游戏中使用单子是毫无意义的
无共享架构(如PHP),其中对象是唯一的
不管怎么说,请求都是无效的。它更容易、更干净地创建
一次使用构建器和工厂模式创建协作者对象图
在请求的开头
单例还违反了一些“可靠的”OOP设计原则
和得墨忒尔定律。无法序列化单例。他们不能
被子类型化(在PHP5.3之前)并且不会被垃圾收集,因为
作为单例的静态属性存储的实例
另见:
要明确的是,我不想多次实例化同一个类。我只想实例化它一次,并通过一些引用跟踪对该实例所做的任何更改。这可能吗?如果可能,如何做到?谢谢
当然这是可能的。你可以这样做:
首先,由于您不想多次实例化该类,只需实例化一次即可:
$instance = new Class();
然后您希望跟踪对该实例所做的更改。我不太明白你的意思。也许你的意思是只保留一个实例。您可以这样做,因为您只实例化了一次,所以可以使用$instance
变量引用该实例
此外,您还可以在某些其他变量中“引用”该$instance
:
$reference = $instance;
现在,您可以使用$instance
和$reference
变量访问类的单个实例
如果需要监视实例,我建议您创建一个执行此任务的:
$decorator = new ClassDecorator(new Class());
然后,在任何东西到达类之前,装饰器可以充当拦截器
要了解类的内部状态是否已更改,还可以使用序列化
和取消序列化
函数:
$instance = new Class();
$snapshot = serialize($instance);
...
# more code, $instance is changed or not, we don't know
...
$changed = $snapshot != serialize($instance);
希望这有帮助。这只是一个想法。通常我是用Java开发的,很抱歉弄错了。请结合其他示例。包括\uuuu clone()
和\uuuu wakeup()
以防止克隆和反序列化。将此示例与其他示例结合使用。包括someMethod()
和示例example::singleton()->someMethod()
。(我更喜欢另一个示例的getInstance()
方法名。)
$instance = new Class();
$snapshot = serialize($instance);
...
# more code, $instance is changed or not, we don't know
...
$changed = $snapshot != serialize($instance);