【发布时间】:2012-03-29 03:41:56
【问题描述】:
我正在使用 PHP 5.2.9 学习和探索 PHPUnit 的应用程序,并且遇到了全局问题。我已将 $backupGlobals 设置为 FALSE,包括文档“@backupGlobals disabled”,这似乎不会影响 PHPUnit 备份全局变量的行为。有什么我想念的吗?我需要更改 PHPUnit 的 xml 文件吗?创建引导程序?
config.php:
$testString = 'Hello world!';
basicApp.php:
require ('D:\data\clients\security.ca\web_sites\QRASystems.com\wwwroot\__tests\BasicApp\config.php');
class BasicApp {
public $test;
public function __construct() {
global $testString;
$this->test = $testString;
}
public function getTest() {
return $this->test;
}
public function setTest($test){
$this->test = $test;
}
BasicAppTest.php:
require ('D:\data\clients\security.ca\web_sites\QRASystems.com\wwwroot\__tests\BasicApp\BasicApp.php');
class BasicAppTest extends PHPUnit_Framework_TestCase{
protected $testClass;
protected $backupGlobals = FALSE;
protected $backupGlobalsBlacklist = array('testString');
public function SetUp(){
$this->testClass = new BasicApp;
$this->testClass->bootstrap();
}
public function testGlobal(){
echo $this->testClass->getTest();
$this->assertNotNull($this->backupGlobals);
$this->assertFalse($this->backupGlobals);
$this->assertNotEmpty($this->testClass->test);
}
public function testMethods(){
$this->testClass->setTest('Goodbye World!');
echo $this->testClass->getTest();
$this->assertNotNull($this->backupGlobals);
$this->assertNotNull($this->testClass->test);
if (empty($this->testClass->test)) echo 'Method set failed!';
}
}
testGlobal() 在 $this->assertNotEmpty($this->testClass->test) 上失败,表明 $this->backupGlobals 设置为 FALSE,PHPUnit 仍在备份全局变量。
编辑:我通过进行以下更改来完成这项工作-
BasicAppTest.php:
protected $backupGlobals = FALSE; <- REMOVED
protected $backupGlobalsBlacklist = array('testString'); <- REMOVED
config.php:
global $testString; <- ADDED
$testString = 'Hello world!';
我惊呆了,这在以前没有被报道过!
【问题讨论】:
-
需要
global $testString;这一行吗?我的理解是,全局范围内的global关键字没有效果,因为你已经在全局范围内了。 -
@DavidHarkness 您无法知道何时编写代码是否在全局范围内。仅仅因为您在文件的主要范围内而不是在函数内并不意味着您将在运行时处于全局范围内。如果该文件是函数内的
included,那么您实际上将处于该函数的范围内,即使在文件的主范围内也是如此。出于这个原因,通常认为最好的做法是始终使用global关键字声明一个您想要全局的变量。这样你就知道无论如何它都是全球性的。