我正在建立一个jenkins工作来构建和部署Zend Framework 2 php应用程序。 在我的ant构建脚本中,我已经定义了一个用于验证php文件的lint作业。
构建作业失败,因为lint在ZF2库文件中检测到错误。
这是lint生成的输出:
[apply] PHP Fatal error: Constructor Zend\Captcha\Factory::factory() cannot be static in /var/lib/jenkins/workspace/XXX/vendor/zendframework/zendframework/library/Zend/Captcha/Factory.php on line 90
[apply] Errors parsing /var/lib/jenkins/workspace/XXX/vendor/zendframework/zendframework/library/Zend/Captcha/Factory.php
有人知道为什么验证Zend/Captcha/Factory.php fails
?
ANT任务看起来像这样:
<target name="lint" description="Perform syntax check of sourcecode files">
<apply executable="php" failonerror="true">
<arg value="-l" />
<fileset dir="${basedir}/">
<include name="**/*.php" />
<modified />
</fileset>
<fileset dir="${basedir}/tests">
<include name="**/*.php" />
<modified />
</fileset>
</apply>
</target>
答案 0 :(得分:4)
您的问题是因为Zend Framework需要php 5.3.3或更高版本。由于你的Jenkins盒子使用5.3.2,这会带来各种各样的问题。其中一个显然是你现在的错误。
我认为你之前没有注意到这个错误,因为在开发系统上你有5.3.3+安装。尝试将您的测试环境更新到更新版本的php,这将消除此特定问题。
<强>更新强>
为了澄清我的答案,php 5.3.3中有一个向后兼容性中断,它会在你的环境中出现。检查this changelog,特别是这句话:
向后不兼容的变更:
与命名空间类名的最后一个元素同名的方法将不再被视为构造函数。此更改不会影响非命名空间的类。
<?php
namespace Foo;
class Bar {
public function Bar() {
// treated as constructor in PHP 5.3.0-5.3.2
// treated as regular method in PHP 5.3.3
}
}
?>
对5.2.x的迁移没有影响,因为名称空间仅在PHP 5.3中引入。
对于Zend\Captcha\Factory
,有一种方法factory()
是静态的,因此您可以调用Zend\Captcha\Factory::factory()
。在php 4和5到5.3.2之间,此方法也解析为工厂的构造函数。构造函数不能是静态的。
对于这种情况,linter会给你一个致命的错误。