1

假设我有以下内容:

<?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

4

2 回答 2

0

你的方法没有返回它应该返回的任何东西

 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);
    }
于 2012-11-01T21:58:52.377 回答
0

事实证明,问题在于它$validThings被序列化并加载回对象中。这应该可以从它在 apache 重新启动时持续存在的事实中诊断出来;与其说是缓存问题,不如说是持久存在。

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

于 2012-11-05T18:22:43.177 回答