假设我有以下内容:
<?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上重新定位类实例,因此,即使类更改,成员变量也是第一次创建时保存的任何东西。