“在不在对象上下文中时使用$ this”出现在Silex / phpunit案例中

时间:2014-05-03 09:51:48

标签: php symfony phpunit this silex

我有一个Silex应用程序在本地和服务器上运行良好。只是我的phpunit测试在我启动时抛出异常(仅在服务器上,本地它们也可以正常工作):

“不在对象上下文中时使用$ this”

我改变了我的代码并且不再缓存防火墙并且它工作正常(看一下注释部分):

use Silex\Application;
use Silex\ServiceProviderInterface;

class SecurityProvider implements ServiceProviderInterface {

    //private $firewall;

    public function register(Application $app)
    {
        $app['firewall'] = $app->protect(function () use ($app) {
            // FIXME phpunit tests on server don't like the $this reference (no idea why?)
            /*if($this->firewall == null) {
                $this->firewall = new Firewall($app);
            }
            return $this->firewall;*/
            return new Firewall($app);
        });
    }

    public function boot(Application $app)
    {
    }
}

任何人都知道我为什么会遇到异常?

谢谢你们!

1 个答案:

答案 0 :(得分:4)

您在闭包内使用$this。在5.4之前,$this无法在闭包内使用。从5.4开始,$this指的是声明它的对象。

为了能够在PHP 5.3中运行测试,你必须使用类似的东西:

public function register(Application $app)
{
    $that = $this;

    $app['firewall'] = $app->protect(function () use ($app, $that) {
        if($that->firewall == null) {
            $that->firewall = new Firewall($app);
        }

        return $that->firewall;
    });
}