【问题标题】:When using !(self::$_instance instanceof self) why does this fail to work当使用 !(self::$_instance instanceof self) 为什么这不起作用
【发布时间】:2013-01-04 21:24:51
【问题描述】:

我最近编写了一些代码来处理实例化对象、将对象和一些数据分配给对象属性,然后执行对方法的调用以执行某些操作。

但是在循环运行代码时,它无法工作,我不明白为什么,我的示例代码是:-

控制器功能:-

$arrayOfObjects = SomeClass::getItems();
foreach ($arrayOfObjects as $object) {
    SomeOtherObject::getInstance($object, time())->run();
}

SomeOtherObject::getInstance() :-

public static function getInstance($object, $timestamp) {
    if (!(self::$_instance instanceof self)) {
        self::$_instance = new self($object, $timestamp);
    }
    return self::$_instance;
}

private function __contruct($object, $timestamp) {
    $this->_theObjectPassed = $object;
    $this->_theTimestampPassed = $timestamp;
}

让我感到困惑的是 SomeOtherObject 上的 run 方法没有达到我的预期。当我在循环中添加调试时,即在 $object 上输出 getName() 方法时,我为循环中的每个项目得到了相同的方法。

当我将构造对象的方式更改为以下(而不是 getInstance())时,它起作用了:-

$someOtherObject = new SomeOtherObject($object, time());
$someOtherObject->run();

我猜这与 getInstance 方法的工作方式以及它的检查方式有关,但想知道是否有人可以解释一下。

谢谢

【问题讨论】:

  • SomeOtherObject::getInstance() 在您的示例中将像单例创建方法一样。 $_instance 只会在第一次调用getInstance() 之后创建一次。然后在以下调用中,它将始终返回对曾经创建的相同对象的引用。这是问题吗? (不确定我是否理解正确)

标签: php object constructor self instanceof


【解决方案1】:

看来您误解了静态变量。将创建/初始化静态变量每个类一次,而不是每个对象一次。

您的 if 语句仅在第一次调用 getInstance() 时为真,此时 $_instance 尚未初始化。然后将为其分配对 SomeOtherObject 新实例的引用。

在所有后续调用中,if 将返回 false,并且现有的 $_instance 只会被返回,而不是创建一个新的。

从 getInstance() 方法中删除 if 语句:

public static function getInstance($object, $timestamp) {
    return new self($object, $timestamp);
}

【讨论】:

  • 谢谢,我怀疑这与 if 有关。
  • 好的!您应该阅读我在上面的 cmets 中提到的 PHP 中的单例。然后你就会知道if。 ;) 但是要注意的是,在 PHP 中,单例模式真正适用的原因只有几个……玩得开心! :)
猜你喜欢
  • 1970-01-01
  • 2021-06-05
  • 2012-08-06
  • 2017-02-09
  • 1970-01-01
  • 2020-04-16
  • 2022-06-29
  • 2014-08-02
  • 1970-01-01
相关资源
最近更新 更多