Php вызвать функцию из другого файла
Программисты не пишут код в одном файле, а разбивают проект на десятки файлов и папок. Без этого нельзя обойтись, если хотите ориентироваться в проекте. Если у нас будет 1 файл на 100000 строк кода, то работать с ним будет затруднительно.
Один php файл, можно подключить в другой, например так:
Вычислить абсолютный путь для директории и подключить другой файл, который находится в ней, можно следующим образом.
У функции имеются братья. Такие как include_once, require, require_once.
Отличия заключаются в том, что если использовать require, то в случае если файла нет, будет выдаваться ошибка и выполнение скрипта дальше не пойдет, в отличие от include.
В свою очередь постфикс _once означает, что несмотря на то, сколько раз вы попытаетесь подключить файл, он подключится только 1 раз.
Теперь обратите внимание, что организовывать код проекта, при помощи include и require - неправильный подход. Он был хорош 20 лет назад, когда лучше просто не умели.
С помощью функции autoload, вы сможете сделать так, чтобы когда вы пишите название класса например:
То автоматически, если этого еще не сделано, подключался некий файл, в котором и содержится описание данного класса, а об использовании, для этих целей include, require можно просто забыть.
Приведу простой пример того, как можно сделать автозагрузку классов.
Для этого создаем функцию, в которую будет передавать управления всякий раз, когда в коде встречается название класса, который не был объявлен.
В данном случае, мы пытаемся создать экземпляр несуществующего класса Abracadabra .
С помощью spl_autoload_register определили функцию, которая будет разбираться с этой ситуацией. В переменной $class оказалось название класса, который мы вызываем.
Сейчас мы просто печатаем название класса при помощи echo , и нам выведется текст: "Abracadabra".
Если мы вызываем класс, который находится в каком-то пространстве имен, то это также успешно обработается функцией.
Теперь осталось доработать нашу функцию автозагрузки так, чтобы она вместо вывода названия класса (нам это ни к чему), организовывала подключение файла с описанием класса.
Она будет выглядеть следующим образом:
Это очень простой пример, который вы не захотите использовать в настоящих проектах.
У каждого фреймворка могут быть свои способы организовать автозагрузку. Вот описание того, как это работает в yii2: yii2 автозагрузка классов.
Некоторые также придумывают свои велосипеды.
Также существует composer, в котором, при помощи autoload, организована автозагрузка многочисленных расширений.
Доброго времени суток, задался вопросом, каким образом можно вызвать в скрипте РНР часть кода (функцию, класс) из другого файла. При относительно даже небольших проектах, получается так, что накапливается множество функций и классов. И если классы еще как-то можно выделить в файлы (каждый файл отдельно для класса), то функции нужно группировать. Собственно вопрос, кто знает, как можно подгрузить отдельную функцию без подгрузки всего файла?
К примеру, файл библиотеки lib.php
А в других файлах, например, тот же index.php использовать не конструкцию include/require , а такой вариант, что бы загружать определение только одного класса или функции. Есть мысли?
Способы подключения файлов
Для подключения файлов в PHP есть две языковых конструкции: require и require_once . Чем же они отличаются? На самом деле, отличия между ними минимальны. Оба этих ключевых слова подключают файл с указанным именем и вызывают ошибку, если данный файл не существует.
Однако особенность работы require_once состоит в том, что файл будет подключен только один раз, даже если вызвать эту инструкцию несколько раз с одним именем файла.
Видимость переменных в подключаемых сценариях
Следует помнить, что так как подключение файлов — это просто их склеивание в один, то и все переменные в разных сценариях тоже получают общую область видимости.
В PHP нет системы модулей, которая существует в других языках программирования (Python, Java, ECMAScript 6). Невозможно «импортировать» только отдельные переменные или функции из подключаемого сценария.
Из этого также следует, что если подключить один сценарий дважды, то переменные и функции из него тоже обьявятся повторно, а это может вызывать ошибку. Поэтому используйте require_once , чтобы такого не произошло.
Чтобы сделать программный код более удобочитаемым, вы можете к примеру поместить определения функций и/или классов в отдельный файл. Возможность подключения файлов в PHP обеспечивают четыре языковые инструкции:
- include
- require
- include_once
- require_once
Все четыре инструкции могут принимать в качестве параметра имя локального файла. Инструкция include и require очень схожи по действию и отличаются лишь реакцией на невозможность получения запрошенного ресурса. Например, в случае недоступности ресурса include и include_once выводят предупреждение и пытаются продолжить исполнение программы. require и require_once при недоступности запрошенного ресурса останавливают обработку данной страницы.
Зачем разделять и подключать php-сценарии
PHP-разработчики дробят весь исходный код проекта на отдельные сценарии, чтобы с ними проще было работать. Если бы пришлось писать весь код в одном файле, то такой сценарий стал бы просто необъятным и ориентироваться там стало решительно невозможно. Поэтому разделение кода на разные сценарии — это естественный способ бороться со сложностью.
Есть и ещё один положительный эффект от подобного деления. Если вынести повторяющиеся блоки кода в отдельные сценарии, то появится возможность повторно использовать один код в разных файлах и подключать его только по требованию. Хороший пример — это пользовательские функции. Очень удобно объявлять их в отдельном сценарии, а затем подключать там, где эти функции понадобятся.
Функция spl_autoload_register
В больших приложениях количество подключаемых файлов может быть довольно большим. Однако встроенная функция spl_autoload_register() в определенных ситуациях позволяет избежать большого количества инклудов. В качестве параметра она принимает функцию автозагрузки. Эта функция автоматически вызывается, когда в программе начинает использоваться неизвестный класс или интерфейс. И функция автозагруки пытается загрузить этот класс или интерфейс. В качестве параметра функция автозагрузки принимает название класса или интерфейса, которые надо загрузить.
Например, пусть у нас будет файл Person.php , в котором располагается класс Person :
Обращаю внимание, что название файла соответствует названию класса.
Используем функцию автозагрузки для подключения подобного класса:
Функция spl_autoload_register() в качестве параметра принимает название функции автозагрузки - в данном случае это функция my_autoloader() . В качестве параметра она принимает название класса. Например, в данном случае используется класс Person, который в этом скрипте не определен. И когда программа встретит использование данного класса, она вызовет функцию my_autoloader() , в качестве параметра $class передаст в нее название класса Person.
При этом в данном случае неважно какой класс, главное, чтобы он хранился в одноименном файле с расширением .php . В этого программа выведет следующее:
3 ответа 3
Для функций я бы сделал как-то так:
Создаем папку где будут храниться все функции, если функции нужно разбить по контексту - делаем это с помощью папок, допустим для каждой функции создается отдельный файл с ее названием, все что нам нужно написать это класс который на вход будет получать путь к функции и подгружать, т.е. в итоге получается что-то простенькое вида:
И того, используем как-то так
Ну вообщем как-то так, к тому-же этот класс можно было бы потом расширять, например добавить метод для загрузки какой либо "группы" целяком и т.д.
Если же речь идет о неком фронт контроллере для манипуляций вида Functions::call('functionName', $param1, $param2) , то тут нужно смотреть в сторону PHP Closure функций. Т.е. сделать как-то так (загрузка функций из файлов в этом примере упущена):
Т.е. при написании любой функции просто пишете ее как:
Таким образом, при инклуде, функция регистрируется в статическом ассоциативном массиве класса Functions и становиться доступной для вызова вида
Вам осталось только написать необходимое вам сочетание функционала из приведенных мною примеров в класс который лучше всего будет подходить непосредственно вам.
По поводу проксирования методов, можно просто написать __call функцию для класса и добавить proxy небольшой метод для класса Functions:
В PHP есть поддержка вызова одного сценария из другого. С помощью специальной конструкции языка можно вызвать сценарий из отдельного файла по его имени, также как по имени вызываются функции. Такая способность называется подключением файлов. Причём таковым файлом может являться как php-сценарий, так и любой другой текстовый файл. Например, HTML-страница.
Подключение внутри функции
Если подключение файла происходит внутри функции, тогда весь код, содержащийся во включаемом файле, будет вести себя так, как будто он был определен внутри этой функции, т.е. код будет иметь локальную область видимости. Перепишем немного предыдущий пример:
Теперь добавим функцию в test.php :
Так как внутри функции мы объявили переменную $var1 глобальной, она становится также доступной и в глобальной области видимости.
require и require_once
Инструкции require и require_once работают идентично include и include_once за исключением лишь одной особенности. Если подключаемый файл не будет найден, выполнение скрипта будет остановлено, в то время как include и include_once выводят предупреждение и продолжают выполнение скрипта.
Совет : постарайтесь совсем отказаться от использования include и require , применяйте их аналоги с суффиксом _once . Это упростит разбиение большой и сложной программы на относительно независимые модули.
При разработке программ на PHP, возможно, какую-ту часть кода мы захотим использовать одновременно в других файлах с кодом PHP. В этом случае отдельные части кода можно распределить по отдельным файлам. Это позволить не писать один и тот же код по сто раз на сотнях скриптов, а будет достаточно подключить файл с кодом PHP. Кроме того, если потребуется изменить поведение подключаемого кода, достаточно будет изменить код в подключаемом файле.
Для подключения файлов PHP предоставляет ряд возможностей.
Абсолютные и относительные пути
При подключении файла в качестве его адреса можно указывать абсолютный или относительный путь.
Абсолютный путь включает в себя полный адрес файла от корня диска.
Пример: /var/www/web/site/inc/sub.php
Относительный путь содержит адрес только относительно текущей рабочей директории. Так если сценарий лежит в папке /var/www/web/site , то для подключения файла можно использовать такой путь: inc/sub.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_once идентично инструкции include , с той лишь разницей, что если код из файла уже был один раз подключен, он не будет подключен и выполнен повторно. Это помогает избежать проблемы с переопределением функций, переменных и т.д. Чтобы лучше понять как это работает приведем пример:
В test.php попытаемся выполнить следующий код:
Инструкции require и require_once
Действие инструкции require подобно инструкции include: она также подключает внешний файл, вставляя в программу его содержимое. Только теперь, если данный файл не будет найден, действие программы прекратится (инструкция include в этом случае выбрасывает предупреждение):
И также если у нас в коде встретятся несколько инструкций require , которые подключают один и тот же файл, то интерпретатор выдаст ошибку. И также чтобы избежать данной ситуации, следует использовать инструкцию require_once :
Инструкция include_once
Использование инструкции include имеет недостатки. Так, мы можем в разных местах кода неумышленно подключить один и тот же файл, что при выполнении кода вызовет ошибки.
Чтобы исключить повторное подключение файла, вместо инструкции include следует применять инструкцию include_once
И теперь, если мы подключим этот же файл с помощью include_once еще где-нибудь ниже, то это подключение будет проигнорировано, так как файл уже подключен в программу.
include
Инструкция include позволяет подключать и присоединять к вашему PHP-сценарию другие сценарии. При запуске программы интерпретатор просто заменит инструкцию на содержимое подключаемого файла. Давайте посмотрим как это работает, создайте файл с именем add.php и напишите внутри:
Теперь создадим другой файл и назовем его к примеру test.php , в котором мы подключим файл add.php :
Как видно из примера инструкция include присоединяет содержимое подключаемого файла, благодаря этому ваша программа получает доступ к другим переменным, функциям, классам и т.д.
Примечание: вы можете присваивать подключаемым файлам любые имена, но всегда добавляйте расширение .php , потому что при использовании другого расширения, злоумышленники могут запросить ваш файл, и веб-сервер вернет его текст. Это угроза безопасности, поскольку могут быть раскрыты пароли или принцип действия вашей программы, что дает лазейку злоумышленникам. Чтобы этого не происходило, подключаемые файлы должны обрабатываться интерпретатором PHP.
Примеры подключения файлов
Для начала посмотрим, как просто подключить один сценарий внутри другого. Для этого воспользуемся инструкцией require . Предположим, у нас есть два сценария: index.php и sub.php .
Содержимое файла sub.php :
В файле index.php находится код, который подключит сценарий sub.php :
Интересный факт: require можно использовать как ключевое слово, либо как функцию.
Результат будет одним и тем же:
Результат работы:
Что произошло? Два сценария как бы склеились в один: выполнилось все содержимое sub.php и добавилось в начало сценария index.php .
О том, как работать с функцией require , подробно рассказано в этом задании.
Путь к файлу
Файлы подключаются исходя из указанного пути к файлу, если путь не указан, будет использоваться путь, который указан в директиве include_path (в конфигурационном файле php.ini ). Если файл не найден по указанному пути в include_path , инструкция include попытается проверить текущую рабочую директорию, в которой находится скрипт подключающий файл, если конструкция include не сможет найти файл, будет выдано предупреждение ( warning ).
Если путь указан - не важно какой: абсолютный или относительный (относительно текущей директории, где расположен включающий сценарий) - директива include_path будет проигнорирована.
Полезные константы
В PHP есть полезные встроенные константы, которые пригодятся для использования в пути к подключаемым файла.
__DIR__ — Полный путь к директории, в которой находится текущий сценарий
__FILE__ — Полный путь к текущему сценарию
Читайте также: