无法在PHP中导入/使用命名空间函数

时间:2011-04-13 10:17:07

标签: php namespaces

我有一个名为test.php的命名空间文件,其中包含一个函数和一个类:

namespace Test;
function testFunc(){}
class TestClass{}

然后,如果在另一个文件中我“使用”这两个命名空间元素,那么该类可以工作但不是函数:

use Test\testFunc,
    Test\TestClass;

include "test.php";
new TestClass();
testFunc();

TestClass对象创建正常,但我得到testFunc()的致命错误:

Fatal error: Call to undefined function testFunc()

我认为命名空间支持函数。我做错了什么?

编辑:此处说明 - http://www.php.net/manual/en/language.namespaces.faq.php#language.namespaces.faq.nofuncconstantuse

3 个答案:

答案 0 :(得分:3)

请特别注意http://php.net/manual/en/language.namespaces.rules.php

<?php
namespace A;
use B\D, C\E as F;

// function calls

foo();      // first tries to call "foo" defined in namespace "A"
            // then calls global function "foo"

\foo();     // calls function "foo" defined in global scope

my\foo();   // calls function "foo" defined in namespace "A\my"

F();        // first tries to call "F" defined in namespace "A"
            // then calls global function "F"

// static methods/namespace functions from another namespace

B\foo();    // calls function "foo" from namespace "A\B"

B::foo();   // calls method "foo" of class "B" defined in namespace "A"
            // if class "A\B" not found, it tries to autoload class "A\B"

D::foo();   // using import rules, calls method "foo" of class "D" defined in namespace "B"
            // if class "B\D" not found, it tries to autoload class "B\D"

\B\foo();   // calls function "foo" from namespace "B"

\B::foo();  // calls method "foo" of class "B" from global scope
            // if class "B" not found, it tries to autoload class "B"

答案 1 :(得分:0)

我相信命名空间函数(函数和常量的use关键字的端口)将成为PHP 5.6的一部分

另见:

https://github.com/php/php-src/pull/526

https://wiki.php.net/rfc/use_function

答案 2 :(得分:0)

在PHP 5.6及更高版本中,您可以按以下方式从其他PHP文件导入/使用函数:

require_once __DIR__ . "/../../path/to/your/vendor/autoload.php";
use function myprogram\src\Tools\MyFunc;
//use the imported function
MyFunc();

但是,对于PHP 7.0,我需要将该函数添加到composer.json中的“文件”中:

"autoload" : {
    "psr-4" : {
      "myprogram\\src\\" : "myprogram/src/"
    },
"files" : [
      "myprogram/src/Tools/ScriptWithMyFunc.php"
    ]

然后运行composer dump-autoload更新autoload.php。

替代:

您也可以直接从脚本中导入函数,而无需撰写器:

require_once full\path\to\ScriptWithMyFunc.php;
MyFunc();

但是(至少对我来说),这仅在ScriptWithMyFunc.php没有名称空间时有效。