2012-11-01 35 views
1

比方說,我有以下幾點: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

+0

你對第二個例子的評論說「找不到東西」......你的意思是「找到東西」? –

+0

你的函數永遠不會返回任何東西...... – lonesomeday

+0

valid()的確切語義並不重要。我可能會返回一些東西或者只是輸出$ validThings的值。問題不在那裏。 –

回答

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); 
    } 
+0

爲了清晰起見,我修改了該問題。 array_search函數沒有問題;我看到了使用和不使用該功能的相同行爲。例如,如果我var_dump $ validThings的值,它只有'Stuff',即使代碼清楚地包含'Things'。 –

+0

什麼是你確切的'var_dump'出來..和你測試什麼代碼,這也是你的PHP版本? – Baba

+1

三元不是必需的。你只需要'返回array_search($ input,$ this-> validThings)!== false;' – lonesomeday

0

原來的問題是,$validThings是被序列化並加載回對象。這應該是可以診斷的,因爲它在apache重啓時是持久的;不是緩存問題,而是持續存在。

PHP不會在反序列化時重新初始化類實例,所以成員變量是第一次創建時保存的內容,即使類已更改。