Краткое введение в пространства имен PHP и автозагрузку

задняя часть PHP Операционная система Composer

图片来自www.ngchina.com.cn网

Пространства имен (PHP 5 >= 5.3.0, PHP 7)

Что такое пространство имен? Вообще говоря, пространство имен — это способ инкапсулировать вещи. Эту абстракцию можно увидеть во многих местах. Например, в операционных системах каталог используется для группировки связанных файлов и действует как пространство имен для файлов в каталоге. В качестве конкретного примера файл foo.txt может находиться в обоих каталогах /home/greg и /home/other, но в одном каталоге не может быть двух файлов foo.txt. Кроме того, при доступе к файлу foo.txt вне каталога /home/greg мы должны указать имя каталога и разделитель каталогов перед именем файла, чтобы получить /home/greg/foo.txt. Приложением этого принципа к области программирования является концепция пространств имен.

В PHP пространства имен используются для решения двух типов проблем, возникающих при написании библиотеки классов или приложения для создания повторно используемого кода, такого как классы или функции:

  1. Конфликты имен между написанным пользователем кодом и классами/функциями/константами внутри PHP или сторонними классами/функциями/константами.
  2. Создайте псевдоним (или короткое) для очень длинных имен идентификаторов (обычно определяемых для облегчения первого типа проблем), улучшая читаемость исходного кода.

Пространства имен 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 г.