PHP 子命名空间用法

PHP sub-namespaces usage

PHP 和命名空间。

我假设我误解了它的正确 usage/idea..
(请读到最后)
我有两个文件:1.php2.php

1.php:

namespace App\someNS;

class classname{}

2.php:

namespace App;
include_once("1.php");
use App\someNS; // tried to comment it also, not working

$ x = new classname();
// this fails..

我的假设是命名空间是 containers\scope,因此通过包含一个命名空间 - 我可以访问它的内容;
我预计 use App\someNS 会 "include" 它。

我知道 someNS\classname() 会起作用,但我看不出命名空间的巨大优势,如果它们唯一的 "profit" 是为变量使用相同名称的选项,如果毕竟我仍然需要使用路径来获取它们...我缺少什么?

命名空间就像文件系统中的目录和文件一样工作。

可以进入一个目录执行一个文件:

cd /var/www/project

phpunit SomeTest

或者你可以通过整个路径执行文件:

/var/www/project/phpunit SomeTest

在你的例子中,你可以使用:

//class2
namespace App;

include_once('1.php');
use App\someNS\classname;

$x = new classname();

//class2
namespace App;

include_once('1.php');
use App\someNS;

$x = new someNS\classname();

甚至

//class2
namespace App;

include_once('1.php');

$x = new someNS\classname();

您可以找到更多详细信息here

命名空间、use和包含文件实际上是三个不同的东西:

  • 命名空间只是一个前缀,允许在代码库的不同部分重用相同的 class 和函数名称。

  • use 语句只创建一个别名,因此您不需要键入全名(名称空间+本地名称),或者您可以使用不同名称的所有对象。它不导入或加载代码。

  • include 实际上是使其他文件中的代码可用,但在 PHP.

    [=36 中实现名称空间之前它已经存在多年=]

也就是说,你的代码应该抛出:

Class 'App\classname' not found in ....php

那是因为您的 use 别名是命名空间的别名,所以您需要调用:

new someNS\classname();

为了能够做到 new classname(),您需要为 class:

添加别名
use App\someNS\classname;