Объявления функций приоритета PHP
У меня есть вопрос о том, как функции объявлены в PHP.
Первый тест:
Файл "functions.php" => functions toto(){ return "1"; }
Основной файл
включают в себя ("functions.php") functions toto(){ return "main"; } echo toto();
Второй тест
Файл "functions.php" => functions toto(){ return "1"; }
Файл "functions2.php" => functions toto(){ return "2"; }
Основной файл
включают в себя ("functions.php") включают в себя ("functions2.php") echo toto();
Результаты
Первая тестовая работа и эхо "основного"
Второй тест не работает => фатальная ошибка "функция toto уже определена"
Я делаю дополнительные тесты:
- в первом тесте: поместите функции toto (), прежде чем include не изменит результат.
- Создайте дважды функции toto () в главном файле create Fatal Error
Кто-то может объяснить мне, как именно эта работа?
Спасибо за прочтение
2 ответа
PHP заявления от include
Семейство не копировать-вставлять содержимое включенного файла в контексте включения. Включение происходит во время выполнения.
В вашем первом примере функция toto()
определенный в основном файле создается во время компиляции. Затем, на казни, functions.php
Файл прочитан и проанализирован. Он генерирует ошибку, потому что пытается определить функцию toto()
это уже определено.
То же самое происходит во втором примере во время включения functions.php
, Кроме того, вы получите ту же ошибку, если объявите функцию toto()
два раза в основной скрипт.
В любом случае, функции и константы PHP не могут быть повторно объявлены. Краткая цитата из документации:
PHP не поддерживает перегрузку функций, а также невозможно отменить или переопределить ранее объявленные функции.
Вы можете проверить, была ли функция уже определена (чтобы избежать ее повторного определения), используя function_exists()
PHP функция:
function toto() { return 1; }
if (! function_exists('toto')) {
function toto() { return 2; }
}
Указывает на тему
- Вы можете назвать только одну функцию
toto()
иначе вы получитеFatal error: Cannot redeclare
Ты можешь использоватьif(!function_exists('toto')){ /*declaration*/ }
чтобы предотвратить это. - php выполняет файл завершенный перед включением следующих файлов, означает, что все функции в php будут объявлены, а затем включены. Так что, если первая строка содержит файл, который объявляет
toto()
, но следующая строка объявляет такжеtoto()
, Декларация в том числе броситьFatal error
, - Единственный способ предотвратить это, например, завернуть в первый файл
if(1){ }
вокруг декларации, так что знайтеFatal Error
приходит не из включенного файла.
Прецедент:
//file1.php
<?php
function toto(){ echo __FILE__; }
//file2.php
<?php
include 'file1.php';
function toto(){ echo __FILE__; }
toto();
Звоните:php file2.php
Результат: Фатальная ошибка: Невозможно повторно объявить toto() (ранее объявлено в file2.php)
//file1.php
<?php
function toto(){ echo __FILE__; }
//file2.php
<?php
include 'file1.php';
if(1){
function toto(){ echo __FILE__; }
}
toto();
Звоните:php file2.php
Результат: Фатальная ошибка: Невозможно переопределить toto() (ранее объявлено в file1.php)