Php подключить файл use
Пространства имен позволяют избежать конфликта имен и сгруппировать функционал. Внутри пространства имен могут быть размещены классы, интерфейсы, функции и константы.
Если какая-та конструкция (например, класс или функция) определена вне любого пространства имен, то считается, что она расположена в глобальном пространстве имен.
Определение пространства имен
Для создания пространства имен применяется директива namespace , после которой идет название пространства имен:
В данном случае определено пространство имен "base". Обычно названия пространств указываются в нижнем регистре. Все, что расположено ниже этой директивы, относится к пространству имен "base". То есть класс Person принадлежит пространству имен base.
Стоит учитывать, что определение пространства имен должно быть расположено выше любого другого кода или разметки html. Например:
Обращение к пространству имен
Для обращения к конструкциям из пространства имен перед названием конструкции через слеш указывается ее пространство имен. Например, у нас есть файл Person.php :
Теперь в другом файле подключим этот файл и обратимся к классу Person:
Здесь определено другое пространство имен - "work". Сначала в нем подключается файл "Person.php". Затем создаем объект класса Person.
Если конструкции одного пространства имен используются в другом пространстве имен (в том числе в глобальном пространстве имен), то перед названием конструкции указывается название ее пространства имен. Так, поскольку класс Person расположен в другом пространстве имен - "base", то перед названием класса указываем его полное имя с учетом его пространства имен:
Обратите внимание, что сначала идет слеш, потом название пространства имен и потом через слеш название класса ( \base\Person ).
Без указания пространства имен мы можем использовать конструкцию только в том же пространстве имен, в котором она определена.
Вложенные пространства имен
Одни пространства имен могут содержать другие. Например:
Здесь класс Person определен в пространстве имен base\classes\ . То есть теперь для обращения к классу Person в другом пространстве имен надо указывать \base\classes\Person :
Псевдонимы
Если в одном пространстве имен используется какой-то класс из другого пространства имен, то писать каждый раз полное имя класса с учетом его пространства имен может быть утомительно, кроме того, перегружает код. Например:
В этом случае мы можем использовать псевдонимы, которые задаются в виде
Конструкция use импортирует класс из другого пространства имен, а оператор as устанавливает для него псевдоним.
Так, сократим предыдущий код с помощью псевдонимов:
В данном случае для класса \base\classes\Person установлен псевдоним User , соответственно теперь для обращения к классу Person мы можем использовать его псевдоним User. Результат тот же, но кода меньше.
Можно использовать только конструкцию use без указания псевдонима. Тогда класс можно будет исользовать по его непосредственному имени:
Подключение множества классов
Подобным образом можно подключать сразу несколько классов. Например, пусть в файле Person.php имеются следующие классы:
Подключение классов Person и Employee:
Определение псевдонимов можно сократить:
Подключение констант и функций
Для подключения констант применяется инструкция use const , а для подключения функций - use function .
Например, определение файла Person.php :
Подключим класс Person вместе с константой adminName и функцией printPerson:
The keyword 'use' has two different applications, but the reserved word table links to here.
It can apply to namespace constucts:
file1:
class Cat <
static function says () > ?>
file2:
class Dog static function says () > ?>
file3:
class Animal static function breathes () > ?>
file4:
include 'file1.php' ;
include 'file2.php' ;
include 'file3.php' ;
use foo as feline ;
use bar as canine ;
use animate ;
echo \ feline \ Cat :: says (), "
\n" ;
echo \ canine \ Dog :: says (), "
\n" ;
echo \ animate \ Animal :: breathes (), "
\n" ; ?>
Note that
felineCat::says()
should be
\feline\Cat::says()
(and similar for the others)
but this comment form deletes the backslash (why. )
The 'use' keyword also applies to closure constructs:
$callback =
function ( $pricePerItem ) use ( $tax , & $total )
$total += $pricePerItem * ( $tax + 1.0 );
>;
array_walk ( $products_costs , $callback );
return round ( $total , 2 );
>
?>
Tested on PHP 7.0.5, Windows
The line "use animate;" equals the line "use animate as animate;"
but the "use other\animate;" equals "use other\animate as animate;"
file1:
class Cat <
static function says () > ?>
file2:
class Dog static function says () > ?>
file3:
class Animal static function breathes () > ?>
file4:
include 'file1.php' ;
include 'file2.php' ;
include 'file3.php' ;
use foo as feline ;
use bar as canine ;
use other \ animate ; //use other\animate as animate;
echo feline \ Cat :: says (), "
\n" ;
echo canine \ Dog :: says (), "
\n" ;
echo \ animate \ Animal :: breathes (), "
\n" ; ?>
In addition to using namespaces and closures, the use keyword has another new meaning as of PHP 5.4 - using traits:
trait Hello public function sayHello () echo 'Hello ' ;
>
>
trait World public function sayWorld () echo 'World' ;
>
>
class MyHelloWorld use Hello , World ;
public function sayExclamationMark () echo '!' ;
>
>
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
Возможность ссылаться на внешнее абсолютное имя по псевдониму или импортированию - это важная особенность пространств имён. Это похоже на возможность файловых систем unix создавать символические ссылки на файл или директорию.
PHP может создавать псевдонимы имени/импортировать константы, функции, классы, интерфейсы и пространства имён.
Создание псевдонима имени выполняется с помощью оператора use . Вот пример, показывающий 5 типов импорта:
namespace foo ;
use My \ Full \ Classname as Another ;
// это тоже самое, что и использование My\Full\NSname as NSname
use My \ Full \ NSname ;
// импортирование глобального класса
use ArrayObject ;
// импортирование функции
use function My \ Full \ functionName ;
// псевдоним функции
use function My \ Full \ functionName as func ;
// импортирование константы
use const My \ Full \ CONSTANT ;
$obj = new namespace\ Another ; // создаёт экземпляр класса foo\Another
$obj = new Another ; // создаёт объект класса My\Full\Classname
NSname \ subns \ func (); // вызывает функцию My\Full\NSname\subns\func
$a = new ArrayObject (array( 1 )); // создаёт объект класса ArrayObject
// без выражения "use ArrayObject" мы создадим объект класса foo\ArrayObject
func (); // вызывает функцию My\Full\functionName
echo CONSTANT ; // выводит содержимое константы My\Full\CONSTANT
?>
Обратите внимание, что для имён в пространстве имён (абсолютные имена, содержащие разделитель пространств имён, такие как Foo\Bar , в отличие от глобальных имён, которые его не содержат, такие как FooBar ) нет необходимости в начальном обратном слеше (\) и его присутствие там не рекомендуется, так как импортируемые имена должны быть абсолютными и не обрабатываются относительно текущего пространства имён.
PHP дополнительно поддерживает удобное сокращение для задания нескольких операторов use в одной и той же строке
use My \ Full \ Classname as Another , My \ Full \ NSname ;
?php$obj = new Another ; // создаёт объект класса My\Full\Classname
NSname \ subns \ func (); // вызывает функцию My\Full\NSname\subns\func
?>
Импорт выполняется во время компиляции и поэтому не влияет на имена динамических классов, функций или констант.
use My \ Full \ Classname as Another , My \ Full \ NSname ;
?php$obj = new Another ; // создаёт объект класса My\Full\Classname
$a = 'Another' ;
$obj = new $a ; // создаёт объект класса Another
?>
В дополнение, импорт распространяется только на неполные и полные имена. Абсолютные имена не затрагиваются операцией импорта.
use My \ Full \ Classname as Another , My \ Full \ NSname ;
?php$obj = new Another ; // создаёт объект класса My\Full\Classname
$obj = new \ Another ; // создаёт объект класса Another
$obj = new Another \ thing ; // создаёт объект класса My\Full\Classname\thing
$obj = new \ Another \ thing ; // создаёт объект класса Another\thing
?>
Обзор правил для импорта
Ключевое слово use должно быть указано в самом начале файла (в глобальной области) или внутри объявления пространства имён. Это необходимо потому, что импорт выполняется во время компиляции, а не во время исполнения, поэтому оно не может быть заключено в блок. Следующий пример показывает недопустимое применение ключевого слова use :
function toGreenlandic ()
use Languages \ Danish ;
Замечание:
Правила импорта задаются на каждый файл отдельно. Это означает, что присоединяемые файлы НЕ будут наследовать правила импорта из родительского файла.
Описание группирования в одном операторе use
Классы, функции и константы, импортируемые из одного и того же namespace , могут группироваться в одном операторе use .
use some \namespace\ ClassA ;
use some \namespace\ ClassB ;
use some \namespace\ ClassC as C ;
use function some \namespace\ fn_a ;
use function some \namespace\ fn_b ;
use function some \namespace\ fn_c ;
use const some \namespace\ ConstA ;
use const some \namespace\ ConstB ;
use const some \namespace\ ConstC ;
// Эквивалентно следующему групповому использованию
use some \namespace\< ClassA , ClassB , ClassC as C >;
use function some \namespace\< fn_a , fn_b , fn_c >;
use const some \namespace\< ConstA , ConstB , ConstC >;
The keyword 'use' has two different applications, but the reserved word table links to here.
It can apply to namespace constucts:
file1:
class Cat <
static function says () > ?>
file2:
class Dog static function says () > ?>
file3:
class Animal static function breathes () > ?>
file4:
include 'file1.php' ;
include 'file2.php' ;
include 'file3.php' ;
use foo as feline ;
use bar as canine ;
use animate ;
echo \ feline \ Cat :: says (), "
\n" ;
echo \ canine \ Dog :: says (), "
\n" ;
echo \ animate \ Animal :: breathes (), "
\n" ; ?>
Note that
felineCat::says()
should be
\feline\Cat::says()
(and similar for the others)
but this comment form deletes the backslash (why. )
The 'use' keyword also applies to closure constructs:
$callback =
function ( $pricePerItem ) use ( $tax , & $total )
$total += $pricePerItem * ( $tax + 1.0 );
>;
array_walk ( $products_costs , $callback );
return round ( $total , 2 );
>
?>
Tested on PHP 7.0.5, Windows
The line "use animate;" equals the line "use animate as animate;"
but the "use other\animate;" equals "use other\animate as animate;"
file1:
class Cat <
static function says () > ?>
file2:
class Dog static function says () > ?>
file3:
class Animal static function breathes () > ?>
file4:
include 'file1.php' ;
include 'file2.php' ;
include 'file3.php' ;
use foo as feline ;
use bar as canine ;
use other \ animate ; //use other\animate as animate;
echo feline \ Cat :: says (), "
\n" ;
echo canine \ Dog :: says (), "
\n" ;
echo \ animate \ Animal :: breathes (), "
\n" ; ?>
In addition to using namespaces and closures, the use keyword has another new meaning as of PHP 5.4 - using traits:
trait Hello public function sayHello () echo 'Hello ' ;
>
>
trait World public function sayWorld () echo 'World' ;
>
>
class MyHelloWorld use Hello , World ;
public function sayExclamationMark () echo '!' ;
>
>
При разработке программ на PHP, возможно, какую-ту часть кода мы захотим использовать одновременно в других файлах с кодом PHP. В этом случае отдельные части кода можно распределить по отдельным файлам. Это позволить не писать один и тот же код по сто раз на сотнях скриптов, а будет достаточно подключить файл с кодом PHP. Кроме того, если потребуется изменить поведение подключаемого кода, достаточно будет изменить код в подключаемом файле.
Для подключения файлов PHP предоставляет ряд возможностей.
Инструкция include
Инструкция include подключает в программу внешний файл с кодом php. Так, для примера определим файл welcome.php :
Здесь определена функция welcome , которая в качестве параметра принимает условное имя и использут его для вывода приветствия.
Теперь подключим данный файл в нашу программу, которая определена в другом файле в той же папке:
В место определения инструкции include будет вставляться весь код из файла welcome.php . При этом вставка файла должна происходить до использования функции, определенной в этом файле. При этом в данном случае файл welcome.php и файл, в который он подключается, располагаются в одной папке.
Конструкция include может использовать как относительные, так и абсолютные пути. Например, выше использовался относительный путь. Или, к примеру, если мы имеем слующую структуру
То чтобы подключить файл welcome.php из папки scripts , в файле index.php необходимо использовать следующий относительный путь:
Если файл welcome.php располагается по полному пути C:\localhost\scripts\welcome.php , то также можно было бы использовать абсолютный - полный путь:
Инструкция include_once
Использование инструкции include имеет недостатки. Так, мы можем в разных местах кода неумышленно подключить один и тот же файл, что при выполнении кода вызовет ошибки.
Чтобы исключить повторное подключение файла, вместо инструкции include следует применять инструкцию include_once
И теперь, если мы подключим этот же файл с помощью include_once еще где-нибудь ниже, то это подключение будет проигнорировано, так как файл уже подключен в программу.
Инструкции require и require_once
Действие инструкции require подобно инструкции include: она также подключает внешний файл, вставляя в программу его содержимое. Только теперь, если данный файл не будет найден, действие программы прекратится (инструкция include в этом случае выбрасывает предупреждение):
И также если у нас в коде встретятся несколько инструкций require , которые подключают один и тот же файл, то интерпретатор выдаст ошибку. И также чтобы избежать данной ситуации, следует использовать инструкцию require_once :
Функция spl_autoload_register
В больших приложениях количество подключаемых файлов может быть довольно большим. Однако встроенная функция spl_autoload_register() в определенных ситуациях позволяет избежать большого количества инклудов. В качестве параметра она принимает функцию автозагрузки. Эта функция автоматически вызывается, когда в программе начинает использоваться неизвестный класс или интерфейс. И функция автозагруки пытается загрузить этот класс или интерфейс. В качестве параметра функция автозагрузки принимает название класса или интерфейса, которые надо загрузить.
Например, пусть у нас будет файл Person.php , в котором располагается класс Person :
Обращаю внимание, что название файла соответствует названию класса.
Используем функцию автозагрузки для подключения подобного класса:
Функция spl_autoload_register() в качестве параметра принимает название функции автозагрузки - в данном случае это функция my_autoloader() . В качестве параметра она принимает название класса. Например, в данном случае используется класс Person, который в этом скрипте не определен. И когда программа встретит использование данного класса, она вызовет функцию my_autoloader() , в качестве параметра $class передаст в нее название класса Person.
При этом в данном случае неважно какой класс, главное, чтобы он хранился в одноименном файле с расширением .php . В этого программа выведет следующее:
Читайте также: