При разработке программ на PHP, возможно, какую-ту часть кода мы захотим использовать одновременно в других файлах с кодом PHP. В этом случае отдельные части кода можно распределить по отдельным файлам. Это позволить не писать один и тот же код по сто раз на сотнях скриптов, а будет достаточно подключить файл с кодом PHP. Кроме того, если потребуется изменить поведение подключаемого кода, достаточно будет изменить код в подключаемом файле.
Для подключения файлов PHP предоставляет ряд возможностей.
Инструкция include подключает в программу внешний файл с кодом php. Так, для примера определим файл welcome.php:
<?php function welcome($name) { echo "Hello, $name"; } ?>
Здесь определена функция welcome
, которая в качестве параметра принимает условное имя и использут его для вывода приветствия.
Теперь подключим данный файл в нашу программу, которая определена в другом файле в той же папке:
<?php include "welcome.php"; $name = "Tom"; welcome($name); ?>
В место определения инструкции include будет вставляться весь код из файла welcome.php. При этом вставка файла должна происходить до использования функции, определенной в этом файле. При этом в данном случае файл welcome.php и файл, в который он подключается, располагаются в одной папке.
Конструкция include
может использовать как относительные, так и абсолютные пути. Например, выше использовался относительный путь. Или, к примеру, если мы имеем следующую структуру
Файл index.php
Папка scripts
Файл welcome.php
То чтобы подключить файл welcome.php
из папки scripts
, в файле index.php необходимо
использовать следующий относительный путь:
include "scripts/welcome.php";
Если файл welcome.php
располагается по полному пути C:\localhost\scripts\welcome.php
, то также можно было бы использовать абсолютный -
полный путь:
include "C:\localhost\scripts\welcome.php";
Использование инструкции include имеет недостатки. Так, мы можем в разных местах кода неумышленно подключить один и тот же файл, что при выполнении кода вызовет ошибки.
Чтобы исключить повторное подключение файла, вместо инструкции include
следует применять инструкцию include_once
<?php include_once "welcome.php"; $name = "Sam"; welcome($name); ?>
И теперь, если мы подключим этот же файл с помощью include_once
еще где-нибудь ниже, то это подключение будет проигнорировано, так как файл уже подключен в программу.
Действие инструкции require подобно инструкции include: она также подключает внешний файл, вставляя в программу его содержимое.
Только теперь, если данный файл не будет найден, действие программы прекратится (инструкция include
в этом случае выбрасывает предупреждение):
<?php require "welcome.php"; ?>
И также если у нас в коде встретятся несколько инструкций require
, которые подключают один и тот же файл, то интерпретатор выдаст ошибку. И также
чтобы избежать данной ситуации, следует использовать инструкцию require_once:
<?php require_once "welcome.php"; ?>
В больших приложениях количество подключаемых файлов может быть довольно большим. Однако встроенная функция spl_autoload_register() в определенных ситуациях позволяет избежать большого количества инклудов. В качестве параметра она принимает функцию автозагрузки. Эта функция автоматически вызывается, когда в программе начинает использоваться неизвестный класс или интерфейс. И функция автозагруки пытается загрузить этот класс или интерфейс. В качестве параметра функция автозагрузки принимает название класса или интерфейса, которые надо загрузить.
Например, пусть у нас будет файл Person.php, в котором располагается класс Person:
<?php class Person { private $name, $age; function __construct($name, $age) { $this->name = $name; $this->age = $age; } function printInfo() { echo "Name: $this->name<br>Age: $this->age"; } } ?>
Обращаю внимание, что название файла соответствует названию класса.
Используем функцию автозагрузки для подключения подобного класса:
<?php function my_autoloader($class) { echo "Вызов функции автозагрузки<br>"; include $class . ".php"; } spl_autoload_register("my_autoloader"); $tom = new Person("Tom", 25); $tom->printInfo(); ?>
Функция spl_autoload_register()
в качестве параметра принимает название функции автозагрузки - в данном случае это функция my_autoloader()
.
В качестве параметра она принимает название класса. Например, в данном случае используется класс Person, который в этом скрипте не определен. И когда
программа встретит использование данного класса, она вызовет функцию my_autoloader()
, в качестве параметра $class
передаст в
нее название класса Person.
Все действия функции автозагрузки мы определяем сами. В данном случае с помощью echo
выводится некоторое диагностическое сообщение и
подключается файл класса:
include $class . ".php";
При этом в данном случае неважно какой класс, главное, чтобы он хранился в одноименном файле с расширением .php
.
В этом случае программа выведет следующее:
Вызов функции автозагрузки Name: Tom Age: 25