php类成员数组被不适当地缓存

时间:2012-11-01 21:54:54

标签: 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'

现在假设我将$ validThings初始化的代码更改为:

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

我们希望:

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

我看到的行为是,第二次通话仍然无法找到“事情”。我怀疑这与PHP的缓存方式有关,但我不知道具体是什么。它具有高度可重复性:我可以在代码中以任何方式更改数组,只要我不在函数调用中修改该成员变量,它将保持原始值... 即使在apache中也是如此硬重启

有没有人看过这个可以解释这种行为的人?

澄清一点:这里有一些形式的缓存行为与php的某些实现细节或php的缓存有关。这不是代码错误;它只是这个代码揭示的行为。此外,我们正在使用hidef,这可能是一个显着的细节和PHP 5.2.10

2 个答案:

答案 0 :(得分:0)

你的方法没有返回原本应该的东西

 return array_search($input, $this->validThings);
如果元素是第一个可以在PHP中解释为array_search的元素,那么

0有时可以返回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);
    }

答案 1 :(得分:0)

事实证明问题是$validThings被序列化并加载回对象。这应该是可以诊断的,因为它在apache重启时是持久的;不是缓存问题,而是持久存在。

PHP不会在反序列化时重新初始化类实例,因此成员变量是第一次创建时保存的内容,即使类已更改。