Php 在命名空间B的函数中使用命名空间A的函数

Php 在命名空间B的函数中使用命名空间A的函数,php,namespaces,Php,Namespaces,我有一个脚本a,放在名称空间a中。在这个脚本中,我将其中定义的所有函数包装在一个类a中 然后我有另一个脚本B,放在名称空间B中,脚本的所有函数也被包装到一个类B中 类B包含10个函数,而其中只有一个函数B_1需要访问类a中定义的函数。因此,我决定将require script_a语句放在该函数B_1中 问题是:我想在命名空间B中定义的类B的函数B_1中使用命名空间a中类a的函数a_1。当我在函数B_1中执行此操作时: require "script_A.php"; use n

我有一个脚本a,放在名称空间a中。在这个脚本中,我将其中定义的所有函数包装在一个类a中

然后我有另一个脚本B,放在名称空间B中,脚本的所有函数也被包装到一个类B中

类B包含10个函数,而其中只有一个函数B_1需要访问类a中定义的函数。因此,我决定将
require script_a
语句放在该函数B_1中

问题是:我想在命名空间B中定义的类B的函数B_1中使用命名空间a中类a的函数a_1。当我在函数B_1中执行此操作时:

require "script_A.php";
use namespace_A\class_A;
我的语法校正器告诉我,
意外使用了“use”
。my
require script_A
在函数B_1中后续使用函数A_1的唯一方法似乎是使用完全限定的命名空间调用A_1:

require "script_A.php";
\namespace_A\class_A::A_1();
我只是想再检查一下这是否正常?真的不可能使用“use”在其他名称空间的PHP函数中导入名称空间吗?还是我误解了什么?脚本B的完整代码示例:

namespace B;

class B {
  
  public static function B1() {

    require_once "script_A.php";
    use A\classA;

  }

}
我的linter在这里报告了
use
上的错误。我的备选方案是下面的代码,它是有效的:

namespace B;

class B {
  
  public static function B1() {

    require_once "script_A.php";
    \A\classA::A1();

  }

}
从:

导入的范围规则
use关键字必须在文件的最外层范围(全局范围)或命名空间声明内声明。这是因为导入是在编译时完成的,而不是在运行时,因此它不能是块范围的

以下示例将显示非法使用use关键字:


这是
use
应该放在全局空间中的位置:



需要“脚本”在哪里使用“使用…”?在全球范围内?你能发布完整的源代码吗?示例添加在编辑中,不,引号不是问题,只是忘记了它们,sry。请看我下面的回答,
use
不能在块(方法/函数)内使用。哎呀,该死的,我不知怎的监督了那部分。。非常感谢。因此,如果我想在函数中要求文件,最好的解决方案是通过完全限定名触发_1,我猜?或者,不管我是否使用函数B_1,如果我将require放在B_1中,文件在编译时仍然是必需的吗?您可以将
require
语句保留在B1方法中(它在运行时运行,您应该只在需要时才需要它)。只有
use
必须放在全局空间中
use
声明只是一个别名,不必在加载所需的脚本之后才进行。通过将use声明放在全局范围内(最佳实践:在命名空间声明之后),您应该能够使用别名,而不需要完全限定的名称。但是这样做不行吗?我的意思是,在全局范围内,在文件顶部使用
use
,这只是B1中有条件地
必需的
?您如何看待在函数B1中使用完全限定名的方法(如上所述)?在命名空间声明之后,
需要在方法体中使用“scriptA”
,只需使用
classA
别名,
就可以了;试试看。