Программисты не пишут код в одном файле, а разбивают проект на десятки файлов и папок. Без этого нельзя обойтись, если хотите ориентироваться в проекте. Если у нас будет 1 файл на 100000 строк кода, то работать с ним будет затруднительно.
Один php файл, можно подключить в другой, например так:
include('путь к файлу');
Путь к файлу может быть как абсолютным, так и относительным (http://phpfaq.ru/newbie/paths). Но все таки указывать абсолютный путь, это более правильный подход. Так мы можем быть уверены, что подключится именно тот файл, который нам нужен, вне зависимости от точки входа.
Вычислить абсолютный путь для директории и подключить другой файл, который находится в ней, можно следующим образом.
// получаем путь до директории $path = dirname(__FILE__); // подключаем другой php файл, который в ней лежит include($path . '/file.php');
Подробности о функции include прочитайте в документации (это обязательно): http://php.net/manual/ru/function.include.php
У функции имеются братья. Такие как include_once, require, require_once.
Отличия заключаются в том, что если использовать require, то в случае если файла нет, будет выдаваться ошибка и выполнение скрипта дальше не пойдет, в отличие от include.
В свою очередь постфикс _once означает, что несмотря на то, сколько раз вы попытаетесь подключить файл, он подключится только 1 раз.
Теперь обратите внимание, что организовывать код проекта, при помощи include и require - неправильный подход. Он был хорош 20 лет назад, когда лучше просто не умели.
Правильным было бы организовать проект так, чтобы у вас не было необходимости подключать необходимый код вручную, при помощи приведенных выше функций. Сделать это можно при помощи функции spl-autoload (http://php.net/manual/ru/function.spl-autoload.php).
С помощью функции autoload, вы сможете сделать так, чтобы когда вы пишите название класса например:
$v = new MyClass();
То автоматически, если этого еще не сделано, подключался некий файл, в котором и содержится описание данного класса, а об использовании, для этих целей include, require можно просто забыть.
Приведу простой пример того, как можно сделать автозагрузку классов.
Для этого создаем функцию, в которую будет передавать управления всякий раз, когда в коде встречается название класса, который не был объявлен.
Пример:
spl_autoload_register(function($class){ echo $class; die(); }); $test = new Abracadabra();
В данном случае, мы пытаемся создать экземпляр несуществующего класса Abracadabra
.
С помощью spl_autoload_register
определили функцию, которая будет разбираться с этой ситуацией. В переменной $class оказалось название класса, который мы вызываем.
Сейчас мы просто печатаем название класса при помощи echo
, и нам выведется текст: "Abracadabra".
Если мы вызываем класс, который находится в каком-то пространстве имен, то это также успешно обработается функцией.
Пример:
$test = new MyNamespace\Abracadabra(); // выведет MyNamespace\Abracadabra
Теперь осталось доработать нашу функцию автозагрузки так, чтобы она вместо вывода названия класса (нам это ни к чему), организовывала подключение файла с описанием класса.
Она будет выглядеть следующим образом:
spl_autoload_register(function($class){ require __DIR__ . '/src/' . $class . '.php'; });
Это очень простой пример, который вы не захотите использовать в настоящих проектах.
У каждого фреймворка могут быть свои способы организовать автозагрузку. Вот описание того, как это работает в yii2: yii2 автозагрузка классов.
Некоторые также придумывают свои велосипеды.
Также существует composer, в котором, при помощи autoload, организована автозагрузка многочисленных расширений.