我在父类中成功使用了别名和命名空间的类,但它似乎在子类中不可用。实际错误来自自动装带器。奇怪的是,该函数在父类中工作并且加载正常。如何在子类中提供use
引入的类?
编辑:食谱是无状态的 - 在Base中制作单例然后将它们作为子类MyTest中的成员引用是否有意义?
我有两个文件:
Base.php:
namespace selenium;
use selenium\recipe\Cms as Cms;
class Base extends \PHPUnit_Framework_TestCase
{
public function __construct()
{
Cms::staticfunc(); //works fine
}
}
MyTest.php:
class MyTest extends \selenium\Base
{
public testMyTest()
{
Cms::staticfunc(); //errors here
}
}
答案 0 :(得分:2)
来自评论:
我希望有一种方法可以级联使用而不会在20个左右的子类中复制该行
这是我使用PHP命名空间时遇到的最大问题之一,您必须为当前脚本需要访问的每个文件调用use
。这与我们以前在某些脚本上调用require_once 20次以便引入必要的库时的情况相同。
我更喜欢做的是命名我的文件(因为它们驻留在文件系统上,就像Zend Framework一样)并使用自动加载器来避免整个混乱。我目前使用ZF autoloader,可以在框架之外使用,或者您也可以使用SplAutoload使用vanilla PHP实现。
- 更新 -
我有一个库,我在过去几年里写过,它被命名为Hobis_Api,并且位于具有相同约定的文件系统上; 〜/项目/工程/ DP / hobis / lib中/ Hobis /原料药/ *。为了使用Zend_Loader注册命名空间,我执行以下操作:
// Be sure to set the include path to include the Zend and Hobis_Api files
// Not sure how your setup is, but would look something like:
set_include_path(get_include_path() . ':' . DIRNAME(__FILE__));
require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace(
array(
'Hobis_Api_'
)
);
通常上面的代码会进入一些引导程序文件,你可以从集中式脚本中调用它来注册自动加载器一次。
现在,如果您的包含路径设置正确,那么只要您引用Hobis_Api_*
,它就会自动加载,因此您无需拨打use
或require_once
,示例用法:
// SomeScript.php
// Notice no requires
// I can make a call to Hobis_Api_Image without error
$image = Hobis_Api_Image;
$image->setHeight(400);