我正在从c#转换为php而我在某些地方转换时遇到问题。特别是命名空间。我遇到的问题是,当从另一个命名空间调用一个类时,我必须完全限定每个命名空间。这是正常的吗?
<?php
namespace Lib\Things;
class TheThings
{
}
然后在另一个班级
<?php
namespace App;
use Lib\Things;
class DoStuff
{
public function doStuff()
{
$things = new TheThings();
}
}
这不起作用......我最终不得不这样做
new Lib\Things\TheThings();
或者
<?php
namespace App;
use Lib\Things as T;
class DoStuff
{
public function doStuff()
{
$things = new T\TheThings();
}
}
我在composer.json文件中也有这个
"psr-4": {
"App\\": "app/",
"Lib\\": "lib/"
}
这是正常的还是我在这里做错了什么?
答案 0 :(得分:2)
在PHP manual use
关键字称为导入或别名。
这意味着
use Lib\Things;
和
use Lib\Things as Things;
是一样的。这导致您不必使用完全限定名称来实例化命名空间中的类,您只能使用导入的命名空间的别名。因此,在您的情况下,以下内容将起作用:
<?php
namespace App;
use Lib\Things;
// same as:
// use Lib\Things as Things; // explicit alias
class DoStuff
{
public function doStuff()
{
$things = new Things\TheThings();
}
}
(请注意,这与您的第二个示例相同,唯一的区别是此处的别名未明确设置为T
(默认为Things
)。
为了能够使用没有任何名称空间前缀的类名,您必须设置实际类的别名:
<?php
namespace App;
use Lib\Things\TheThings;
// same as:
// use Lib\Things\TheThings as TheThings; // explicit alias
class DoStuff
{
public function doStuff()
{
$things = new TheThings();
}
}
总之,如果您开始考虑将use
运算符设置为命名空间或类(或其他)的别名,那么您将了解它。
PS 1:
在PHP 7之前,如果要从同一名称空间导入多个类,则必须编写:
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
从PHP 7.0开始,从同一名称空间导入的类,函数和常量可以在一个use语句中组合在一起:
use some\namespace\{ClassA, ClassB, ClassC as C};
PS 2:
composer帮助自动包括/加载实际的php文件,基于一些PSR *规则,它在名称空间如何在裸PHP中工作方面没有任何作用。
答案 1 :(得分:0)
当你这样做时:
$things = new TheThings();
在当前命名空间(在您的示例中为App
)中搜索类,这就是为什么不起作用。
因此,您需要指定完整的类命名空间,因此解释器知道您引用的是哪个类,您还可以拥有namepsace2/TheThings
和this/is/another/namespace/TheThings
类。
只需包含完整的类名称空间
use Lib\Things\TheThings;