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'

ただし、私が見ている動作は、2 番目の呼び出しでも「Things」が見つからないということです。これは、PHP のキャッシュ方法と関係があると思われますが、具体的にはわかりません。再現性が高い: コード内で配列を変更することができ、関数呼び出し内でそのメンバー変数を変更しない限り、元の値を保持します... Apache のハード再起動後でも.

動作を説明できる人はこれを見たことがありますか?

ポイントを明確にするために: ここでは、php の実装の詳細または php の周りのキャッシュに関係する何らかの形式のキャッシュ動作が行われています。これはコードのバグではありません。これは、このコードによって明らかにされた単なる動作です。また、顕著な詳細とphp 5.2.10である可能性があるhidefを使用しています

4

2 に答える 2

0

問題は、$validThingsシリアル化されてオブジェクトにロードされていたことでした。これは、apacheの再起動後も持続していたという事実から診断できるはずです。永続化されるほど、キャッシュの問題ではありません。

PHPは、逆シリアル化時にクラスインスタンスを再初期化しないため、メンバー変数は、クラスが変更された場合でも、最初に作成されたときに保存されたものになります。

于 2012-11-05T18:22:43.177 に答える
0

あなたのメソッドは、本来あるべきものを返していません

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

array_search0要素が 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 に答える