Пространства имен (PHP 5 >= 5.3.0, PHP 7)
Что такое пространство имен? Вообще говоря, пространство имен — это способ инкапсулировать вещи. Эту абстракцию можно увидеть во многих местах. Например, в операционных системах каталог используется для группировки связанных файлов и действует как пространство имен для файлов в каталоге. В качестве конкретного примера файл foo.txt может находиться в обоих каталогах /home/greg и /home/other, но в одном каталоге не может быть двух файлов foo.txt. Кроме того, при доступе к файлу foo.txt вне каталога /home/greg мы должны указать имя каталога и разделитель каталогов перед именем файла, чтобы получить /home/greg/foo.txt. Приложением этого принципа к области программирования является концепция пространств имен.
В PHP пространства имен используются для решения двух типов проблем, возникающих при написании библиотеки классов или приложения для создания повторно используемого кода, такого как классы или функции:
- Конфликты имен между написанным пользователем кодом и классами/функциями/константами внутри PHP или сторонними классами/функциями/константами.
- Создайте псевдоним (или короткое) для очень длинных имен идентификаторов (обычно определяемых для облегчения первого типа проблем), улучшая читаемость исходного кода.
Пространства имен PHP позволяют группировать вместе связанные классы, функции и константы.
Поднимите каштаны:
file.php 文件
<?php
// 使用namespace关键字定义命名空间,
// 且之前不能有东西
namespace Test;
const IN = 'oooo';
function tete()
{
return __METHOD__;
}
class lala
{
function init()
{
return __METHOD__;
}
}
autoload.php 文件
<?php
include 'file.php';
// 函数和常量是不支持use导入规则的,只有类能支持导入规则。
// 如果只是使用use Test就会报错 The use statement with non-compound name 'Test' has no effect in..
use Test\lala; // 也可以use Test\lala as lululu;
echo Test\IN."\n";
$te = new lala(); // new lululu(); // 也可以使用这样的方式来避免两个相同的类名称
Суммировать:
- Хотя в пространство имен может быть включен любой допустимый PHP-код, пространства имен затрагивают только следующие типы кода: классы (включая абстрактные классы и трейты), интерфейсы, функции и константы.
- пространство имен по ключевому словуnamespaceобъявить. Если файл содержит пространства имен, он должен объявлять пространство имен перед всем остальным кодом, кроме одного:declareключевые слова.
- Подобно каталогам и файлам, пространства имен PHP также позволяют указывать имена иерархических пространств имен. Например, "пространство имен MyProject\Sub\Level;"
- Также возможно определить несколько пространств имен в одном файле, но в фигурных скобках. Например:
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace AnotherProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
Это простой обзор, детали места проведенияофициальный сайт пхп
автозагрузка
При написании объектно-ориентированных (ООП) программ многие разработчики создают новый файл PHP для каждого класса. Это создает раздражение: в начале каждого скрипта нужно включать длинный список (по одному файлу на каждый класс).Например:
<?php
include "test1.php";
include "test2.php";
include "test3.php";
......
Так как же избежать этой ситуации?В PHP 5 в этом больше нет необходимости. spl_autoload_register()Функция может зарегистрировать любое количество автоматических погрузчиков, которые автоматически загружают при использовании класса (класса) и интерфейсов, которые не были определены. Регистрируя автоматический погрузчик, сценаривный двигатель имеет последний шанс загрузить желаемый класс, прежде чем ошибка PHP не удалась. Поднимите каштан:
lala.php 文件
<?php
class lala
{
function init()
{
return __METHOD__;
}
}
autoload.php 文件
<?php
spl_autoload_register(function ($class_name){
// 在这里引入将要加载的类文件
// 但是有一点,加载的类文件的文件名称必须是和类名称一样
require_once $class_name.'.php';
});
$tt = new lala();
$tt->init();
Сейчас любому маленькому проекту нужны десятки, а то и сотни классов, конечно, классы с разными функциями нужно разносить по разным папкам, поэтому грузить немного хлопотно. Здесь мы представляемPSR-4Характеристики автозагрузки. В сочетании с пространствами имен, о которых мы говорили выше, наши внутренние проблемы могут быть легко решены в рамках спецификации.
.目录结构
├── App
│ └── MyClass.php
└── test.php
MyClass.php文件
<?php
namespace App;
class MyClass {
public function WhoAmI() {
return __METHOD__;
}
}
test.php文件
<?php
spl_autoload_register(function($class_name) {
require_once str_replace('\\','/',$class_name).'.php';
});
use App\MyClass as MC;
$obj = new MC();
echo $obj->WhoAmI()."\n"; // App\MyClass::WhoAmI
Это всего лишь простой пример, чтобы понять концепцию автозагрузки в реальных проектах, вы можете перейти к composer. Конечно, вы должны сначала узнать соответствующие характеристики PSR-4...
Написано 24 апреля 2018 г.