PHP类成员阵列不适当地缓存



假设我有以下内容:

<?php
class MyClass {
  public $validThings = array("Stuff");
  //checks to see if $input is in the array $validThings
  public function valid($input) {
    return is_int(array_search($input, $this->validThings);
  }
}

我们期望以下内容:

$myClassInstance->valid("Stuff");//finds 'Stuff'
$myClassInstance->valid("Things");//doesn't find 'Things'

现在说,我将$有效性初始化的代码更改为:

public $validThings = array("Stuff", "Things");

我们期望:

$myClassInstance->valid("Stuff");//finds 'Stuff'
$myClassInstance->valid("Things");//finds 'Things'

我看到的行为是第二个电话仍然找不到"事物"。我怀疑这与PHP的缓存有关,但我不知道具体是什么。它是高度重现的:我可以在代码中的任何方式更改数组,只要我不修改函数调用中的该成员变量,它就会容纳原始值... ,即使跨apache hard Restarts也可以

有人看到这个人可以解释行为吗?

澄清一个要点:这里发生了某种形式的缓存行为,这与PHP的某些实现细节或围绕PHP的缓存有关。这不是代码错误;这仅仅是该代码揭示的行为。另外,我们正在使用Hidef,这可能是一个显着的细节,PHP 5.2.10

您的方法没有返回任何应该是

的东西
 return array_search($input, $this->validThings);

array_search有时可以返回 0,如果元素是第一个可以在PHP中解释为false的元素,有时您应该使用此示例;

class MyClass {
    public $validThings = array("Stuff");
    public function valid($input) {
        return array_search($input, $this->validThings) !== false;
    }
}
$myClassInstance = new MyClass();
var_dump($myClassInstance->valid("Stuff")); //true
var_dump($myClassInstance->valid("Things")); //false

编辑

或更高的窗台,您只能使用

    public function valid($input) {
        return in_array($input, $this->validThings);
    }

事实证明,问题是$validThings被序列化并加载回对象。这应该可以诊断出它在apache重新启动之间持续存在的事实。

不是一个缓存的问题。

php不会在de-serialization上重新定位类实例,因此,即使类更改,成员变量也是第一次创建时保存的任何东西。

最新更新