Trait方法只在第一次加载时工作


PHP Trait method works only on first load

我正在使用PHP 5.4.10的MAMP,我有以下MWE的问题:

<?php
trait T {
    public function hello() { echo 'hello'; }
}
class A {
    use T;
}
$a = new A();
$a->hello();
?>

页面在第一次加载时显示'hello'。但是,当我点击刷新时,我得到一个错误500。

如果我修改文件(例如,只是通过在某处添加空行)并再次刷新,'hello'再次显示。再次点击刷新,错误500又回来了。

知道这可能来自哪里吗?

更新:

这显示在PHP错误日志中(Apache错误日志中没有):PHP Fatal error: Call to undefined method A::0? ()

(当我重复操作时,0并不总是具有相同的名称)。

Xcache可能是这里的问题,尝试关闭缓存(或至少Xcache),然后再试一次

我也有同样的问题,感谢@Leon Weemen,我专注于XCache。我发现这个错误(在XCache 3.0.1中修复了)正是导致这个问题的原因(我的XCache版本是2.0.0)。他们建议您在php.ini中设置以下值来解决问题:

xcache.mmap_path = "/tmp/xcache"
xcache.readonly_protection = on

然而,这个变通方法并不能解决我的问题。我能够禁用XCache的唯一方法是使用ini_set() PHP方法。在我的应用程序的最开始,下面的代码片段解决了这个问题,并准备在XCache更新后立即使用它:

try{
    $xCache = new ReflectionExtension('xcache');
    if(version_compare($xCache->getVersion(), '3.0.1', '<')){
        ini_set('xcache.cacher', 0);
    }
} catch(ReflectionException $e){
    // xCache not installed - everything should work fine
}