关于PHP的命名空间介绍

命名空间是指在编程语言中用来区分不同模块、类、函数等命名的一种机制。它可以帮助开发者更好地组织和管理代码,避免名称冲突,提高程序的可读性和可维护性。

namespaceはFinderやエクスプローラーなどのパスに似ています。
例えば、Finderやエクスプローラーでは同じフォルダー内に同じ名前のファイルを作ることはできません。しかしフォルダーが違えば同じファイル名のものを複数作ることが可能になります。

通过将类和方法等内容写入命名空间,就可以使用相同名称的类和方法,只要命名空间不同,就可以做到这一点。

尝试使用命名空间

<?php

namespace morning;

function greeting(){
   echo "おはようございます";
}

namespace evening;

function greeting(){
   echo "こんばんは";
}

在这里,我们在 morning 和 evening 这两个命名空间中存储了一个名为 greeting() 的方法。
现在,让我们在另一个文件中尝试调用这个 greeting() 方法。
你可以通过在命名空间指定的名称后面加上\(反斜杠)和你想要调用的方法,
或者使用 namespace + 命名空间指定的名称;
来调用你想要的方法。

<?php

//namespaceを宣言してあるファイルを読み込む
require 'qiita.php';

//namespadeで指定したメソッドを呼び出す
morning\greeting();
echo "<br>";
evening\greeting();

执行结果

おはようございます
こんばんは

同じメソッド名を指定してもnamespaceが違うためエラーにならず、正常に実行できました!
ちなみにnamespaceの宣言は波括弧{}を使っても記述することができます。(今回は割愛)

尝试使用子命名空间来指定命名空间。

子命名空间是通过指定命名空间路径来指定命名空间的方法,就像指定目录结构一样。
通过使用子命名空间,可以避免命名空间重复。
可以通过命名空间子命名空间\子命名空间\子命名空间来指定。
使用反斜杠\而不是斜杠/进行描述。

<?php

namespace ABCSchool\classA\Yamada;

function greeting(){
   echo "A組の山田です。";
}

指定子名称空间的格式

如何调用子命名空间有以下三种模式。
我认为重点是决定调用命名空间到哪一层。我们将以以下层次来讨论yamada.php文件的三种模式。

ABCSchool/下层目录/classA/下层目录/yamada.php

非修飾形式

不用修飾的形式

非修飾形式は、namespaceを指定したファイルと同じディレクトリ内から指定する際に使います。メソッドを呼び出すときに、指定したnamespaceの全てのパスを呼び出しているので同じディレクトリ内であるとわかります。

根据下面的例子可以看出,通过yamada.php指定的命名空间ABCSchool\classA\Yamada,与call.php中调用的命名空间ABCSchool\classA\Yamada的路径是相同的,因此它们在同一个目录中。

由于它们位于相同的目录中,所以在调用方法或类时,我们不需要使用命名空间来指定路径名称,只需简单地调用方法名即可。也就是说,我们只需要调用方法名而不需要写路径名。如果在这里指定路径名,将会导致错误。

<?php

//namespaceの指定
namespace ABCSchool\classA\Yamada;

function greeting()
{
    echo 'A組の山田です。';
}

<?php
//ファイルを読み込むよりも先に名前空間を呼び出す
namespace ABCSchool\classA\Yamada;

//namespaceを指定したファイルを読み込む
require 'yamada.php';

//namespaceで定義したメソッドを呼び出す
greeting();

执行结果

A組の山田です

2. 修改方式

修饰形式是通过相对路径调用命名空间的方式。
也就是说,它是以当前正在操作的文件为基准来调用命名空间。

在下面的例子中,目前正在ABCSchool目录中的call.php文件中进行工作。因此,只有在进入较低层次的目录,才能使用命名空间指定的方法。

因此,调用命名空间方法时,需要指定当前目录中的子目录路径。

<?php

//namespaceの指定
namespace ABCSchool\classA\Yamada;

function greeting()
{
    echo 'A組の山田です。';
}

<?php
//ファイルを読み込むよりも先に名前空間を呼び出す
namespace ABCSchool;

//namespaceを指定したファイルを読み込む
require 'yamada.php';

//namespaceで定義したメソッドを呼び出す
classA\Yamada\greeting();

执行结果 (shí jié guǒ)

A組の山田です

3. 全面修改的形式

完全修饰形式是一种在调用命名空间的类或方法时,从根路径起记述并调用的形式。
由于是从最顶层层次进行调用,所以可以从任何目录进行命名空间的调用。
但是,在调用时必须在开头加上反斜杠\。

<?php

//namespaceの指定
namespace ABCSchool\classA\Yamada;

function greeting()
{
    echo 'A組の山田です。';
}

<?php
//ファイルを読み込むよりも先に名前空間を呼び出す
namespace ABCSchool\classA;

//namespaceを指定したファイルを読み込む
require 'yamada.php';

//namespaceで定義したメソッドを呼び出す
//完全修飾形式ではあたまにバックスラッシュが必要
\ABCSchool\classA\Yamada\greeting();

执行结果

A組の山田です

命名空间的扩展功能使用

通过使用子命名空间,我们发现可以通过路径形式来指定命名空间。然而,每次都需要写namespace ABCSchool\classA\Yamada;这样的代码写起来非常繁琐。而use关键字就是用来解决这个问题的功能。

通过使用关键字 “use”,可以将命名空间的一部分或全部替换为另一个名称(别名)以进行指定。

//書き方
use [名前空間の一部または全部クラス関数定数など] as 置き換えたい名前

使用的方法

在as之后创建一个别名(想要替换的名字),并使用use来导入。

<?php

namespace ABCSchool\classA\Yamada;
function greeting()
{
    echo 'A組の山田です。';
}

namespace ABCSchool\classA\Sato;
function greeting()
{
    echo 'A組の佐藤です。';
}

namespace ABCSchool\classA\Kinoshita;
function greeting()
{
    echo 'A組の木下です。';
}

namespace ABCSchool\classA\Watanabe;
function greeting()
{
    echo 'A組の渡辺です。';
}
<?php
//namespaceを指定したファイルを読み込む
require 'qiita.php';

// 名前空間の一部を別名称にする
use ABCSchool\classA as ourClass;

//useで定義した別名称を使ってメソッドを呼び出す
ourClass\Yamada\greeting();
echo "<br>";
ourClass\Sato\greeting();
echo "<br>";
ourClass\Kinoshita\greeting();
echo "<br>";
ourClass\Watanabe\greeting();

执行结果

A組の山田です。
A組の佐藤です。
A組の木下です。
A組の渡辺です。

总结

当我们努力避免类和方法名称重复时,在大型开发项目中可能需要使用更长的名称。为了解决这个问题,我们可以通过指定命名空间来创建具有相同名称的类和方法。使用”use”关键字可以在子命名空间中指定较长的命名空间,并将其重命名为不同的名称。

请在中文中提供以下内容的释义,只需一种选项:

参考 →
– 提供参考
– 给出参考意见
– 给予参考

【PHP入門】解説简化了名字空间的使用方法!
【PHP超入门】深入讲解了名字空间(namespace・use)的相关知识。

bannerAds