【发布时间】:2011-12-08 23:11:41
【问题描述】:
我在我的框架项目中使用命名空间和 PHP 5.3。我有主要的App 类和一个Autoloader 类。在App类中,我设置了几个环境变量:
public static function setupEnv()
{
$os = 'UNIX';
if (stristr(PHP_OS,'WIN'))
{
$os = 'WIN';
}
if (!defined('DIRECTORY_SEPARATOR'))
{
define('DIRECTORY_SEPARATOR',($os == 'UNIX') ? '/' : '\\');
}
define('DS', \DIRECTORY_SEPARATOR);
if (!defined('PATH_SEPARATOR'))
{
define('PATH_SEPARATOR', ($os == 'UNIX') ? ':' : ';');
}
define('PS', \PATH_SEPARATOR);
if (!defined('APP_PATH'))
{
define('APP_PATH', dirname(dirname(__FILE__)));
define('AP', APP_PATH);
}
}
DIRECTORY_SEPARATOR 和DS 都正确定义了常量,如果我在这里回显它们,它们就可以正常工作。它的命名空间是 Feather\App。在Autoloader 类中,我使用DS 常量,它工作正常。 Autoloader 类位于同一个 Feather\App 命名空间中。
我正在运行 PHPUnit,并创建了这个测试 - 在 PHPUnit 的 setUp() 函数中调用了 setupEnv():
public function testAutoloadFunction()
{
$this->assertEquals(
dirname(dirname(__FILE__)) . DS.'Components'.DS.'Collections'.DS.'Collection.php',
\Feather\App\Autoloader::Autoload('\\Feather\\Components\\Collections\\Collection')
);
}
即使路径正确返回,也无法通过测试。它说:
Use of undefined constant DS - assumed 'DS'
所以,我的问题有很多背景故事 - 为什么这是一个错误?我想,好吧,也许我需要引用 \Feather\App\DS,但这会抛出这个:
PHP Fatal error: Undefined constant 'Feather\App\DS' in /web/Feather/Tests/AutoloaderTest.php
我认为常量是在全局范围内定义的,所以这不应该工作吗?如果没有,我该如何做才能让 PHPUnit 满意?如果我将use Feather\App 放在顶部,它仍然会失败并出现同样的assumed 'DS' 错误。
有人能解释一下吗?到目前为止,PHP 文档一直没有帮助!
【问题讨论】:
-
你的一个观察结果一定是错误的。常量未定义,因此
setupEnv()方法和/或App类未在单元测试之前运行。 -
如果我尝试在
setupEnv()命令之前回显DS,它是空的/未定义的。如果我在setupEnv()之后回显它,它就被定义了。这不是在其他地方定义的常量。因此,单元测试使用DS的正确值这一事实,我会反对。 -
在整个单元测试方法中添加
assert('defined("DS")');以了解更多信息。并在init函数中添加print "setupEnv"进行调试。 -
有趣,我刚刚在带有 WAMP 的 Windows 工作站上进行了测试,它可以工作......但在我的 Linux 工作站上,它失败了。今晚我会做更多的挖掘。
-
好的 - 我不知道我做了什么,但它现在正在工作。我认为问题在于我没有检查
if (!defined('DS')),当setUp()函数在后续测试中运行时,它会导致问题。这是我最好的猜测。代码现在可以运行了!
标签: php namespaces constants