Объявления функций приоритета 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)

Другие вопросы по тегам