临时命名空间

时间:2012-04-02 01:10:57

标签: php namespaces

有没有办法临时使用命名空间? 我使用库创建表单并使用名称空间,问题是我通常想在页面中间创建一个表单,因此在全局名称空间中。然后,如果我想调用这个库的任何函数,我必须使用Namespace \

作为前缀

在PHP中没有办法做这样的事情:

Blabla global namespace
strlen('test'); // 4

namespace Namespace
{
    test();
}

More global PHP

让它引用Namespace \ test?

2 个答案:

答案 0 :(得分:3)

http://www.php.net/manual/en/language.namespaces.importing.php

<?php
namespace foo;
use My\Full\Classname as Another;

// this is the same as use My\Full\NSname as NSname
use My\Full\NSname;

// importing a global class
use ArrayObject;

$obj = new namespace\Another; // instantiates object of class foo\Another
$obj = new Another; // instantiates object of class My\Full\Classname
NSname\subns\func(); // calls function My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // instantiates object of class ArrayObject
// without the "use ArrayObject" we would instantiate an object of class foo\ArrayObject
?>

这是你能得到的最接近的 - 暂时无法更改默认命名空间。

答案 1 :(得分:0)

我知道这是一个古老的问题,尽管接受的答案按要求回答了该问题,但我感觉OP真正在问的是“我可以使用其他命名空间中的全局命名空间中的项目吗?这里的答案是一个简单明了的答案。

想象两个类(一个在全局名称空间中,另一个在其自身中:

ClassInGlobal.php

<?php
class ClassInGlobal
{
    public static function doStuff()
    {
        echo 'I do some stuff';
    }
}

ClassInNamespace.php

<?php
namespace App\Classes;

class ClassInNamespace
{
    public function callDoStuff()
    {
        \ClassInGlobal::doStuff();
    }
}

以上执行正常。所需要做的只是指定全限定全局名称空间的斜杠。此外,您可以在名称空间声明之后添加use ClassInGlobal声明,并省略前斜杠。

这可以通过将命名空间的函数抽象为一个类来转化为原始问题,然后可以稍微修改OP的代码以实现此目的:

require './Namespace/Utilities.php';

Blabla global namespace
strlen('test'); // 4

\Namespace\Utilities::test();

More global PHP

希望能帮助到这里来的人。