使用子类在php中级联使用命名空间

时间:2012-03-28 17:49:32

标签: php namespaces

我在父类中成功使用了别名和命名空间的类,但它似乎在子类中不可用。实际错误来自自动装带器。奇怪的是,该函数在父类中工作并且加载正常。如何在子类中提供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 
    }
}

1 个答案:

答案 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_*,它就会自动加载,因此您无需拨打userequire_once,示例用法:

// SomeScript.php

// Notice no requires

// I can make a call to Hobis_Api_Image without error
$image = Hobis_Api_Image;
$image->setHeight(400);
相关问题