Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP类参考_Php_Class_Object_Reference - Fatal编程技术网

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);