我们说我有以下内容:
<?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
答案 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不会在反序列化时重新初始化类实例,因此成员变量是第一次创建时保存的内容,即使类已更改。