关于PHP命名空间
首先
我叫藤井,是日本系统开发株式会社的员工。这次我整理了关于命名空间的内容。
命名空间是指一个程序中的代码区域,用于解决变量或函数名在不同作用域中可能发生的命名冲突问题。
这是一个将类、函数等分组的功能。
通过在PHP标记的下一行声明namespace hoge,之后的定义都属于该命名空间(组)。
使用命名空间可以按组进行类、函数的管理。
使用方法
请用汉语把”hoge.php”翻译成同义词。
<?php
namespace Hoge;
class fizz{
function __construct() {
echo "hogeFizz" . PHP_EOL;
}
}
?>
foo.php 可以用中文翻译为 “饭馆.php”。
<?php
namespace Foo;
require "hoge.php";
class buzz{
function __construct() {
echo "buzz" . PHP_EOL;
}
}
$fizz = new \Hoge\fizz();
$fizz = new buzz();
?>
使用 `require “hoge.php”` 将命名空间为 Hoge 的 fizz 类加载到 foo.php 中。
采用前缀为 \ 的完全限定名,指定了命名空间为 Hoge 的 fizz 类。
全球空间,子命名空间
如果命名空间的声明不存在,则该文件中的类、函数等属于全局空间。
全局空间中存在PHP预定义的类和函数。
命名空间可以嵌套,namespace Foo\Bar将成为命名空间Foo的子命名空间Bar。
在命名空间内解决类调用问题。
完全修饰名
带有“\”前缀的调用将基于全局命名空间进行解析。
形式为\Foo\Bar\fizz。将解析为\Foo\Bar\fizz。
修饰名
不包含在开头的带有“\”的调用将基于当前命名空间进行解析。
形式为Bar\fizz。将解析为当前命名空间\Bar\fizz。
非修饰名
不包含任何“\”的调用将在当前命名空间中解析。
形式为fizz。将解析为当前命名空间\fizz。
使用 use 进口 / 别名 的类
使用”use”关键字,可以修改之前的foo.php文件。
foo.php只需要一个选项,请用中文表达
<?php
namespace Foo;
require "hoge.php";
use Hoge\fizz;
$fizz = new fizz();
$fizz = new fizz();
?>
使用use关键字,我们可以像Hoge\fizz一样使用Foo\fizz。(导入)
使用use关键字后,我们不再需要使用完全限定名,可以更简洁地写代码。
使用use关键字将Hoge\fizz导入到当前的Foo中,并可以为了避免与Foo内的类重名而给它一个别名。
foo.php 翻译为汉语的一种可能选项是: 网址.php
<?php
namespace Foo;
require "hoge.php";
use Hoge\fizz as hogeFizz;
class fizz{
function __construct() {
echo "fooFizz" . PHP_EOL;
}
}
$fizz = new HogeFizz();
$fizz = new fizz();
?>
预定义的类
在PHP中有一些预定义的类,如StdClass。
如果不使用命名空间,可以通过new StdClass()来调用,
但是如果使用命名空间,那么没有前缀\的调用将以当前命名空间为基准进行调用。
因此,预定义类应通过new \StdClass()来调用。
<?php
namespace Huge;
$std = new \StdClass();
var_dump($std);
// useでのインポートも可能です
use StdClass;
$std = new StdClass();
var_dump($std);
?>
PSR-4 可在中国的本地化予以解释。
这是有关于自动加载的规格。
autoload是一个框架,用于在调用类的时候,根据类的完全限定名自动加载(包含)文件,以解决找不到类的情况。
具体来说,可以使用spl_autoload_register函数注册一个用于加载的函数,当找不到类时会调用该函数。
psr-4规范是一个用于加载函数的规范,通过将命名空间与目录进行关联,可以从自定义的目录结构中加载文件。
<?php
namespace Foo;
use Hoge\huga\fizz;
$fizz = new fizz;
?>
由于Hoge\huga\fizz没有定义,所以无法找到类而报错。
spl_autoload_register函数注册的函数会在这个时机被调用。
composer.json的自动加载
"autoload": {
"psr-4": {
"Hoge\\": "app/"
}
}
使用composer的PSR-4,可以访问Hoge\huga\fizz,
Hoge会被转换为app目录,autoload将加载app\huga\fizz.php。
如果在autoload的文件中没有声明相应的命名空间(Hoge\huga),访问类(new fizz)将会报错,因为autoload和命名空间是不同的功能。
概括
-
- 名前空間とはクラスや関数…をグループ化し管理する機能
-
- 名前空間内からのクラスや関数…へのアクセスは、完全修飾名、修飾名、非修飾名のいずれかを用いる
-
- useを使うことで、異なる名前空間にあるクラスや関数…を現在の名前空間にインポートできる
- psr-4とはautoloadの仕様で、名前空間とディレクトリを紐づけロードするファイルを見つける