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

Кто-то может объяснить мне, как именно эта работа?
Спасибо за прочтение

0

Решение

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; }
}
1

Другие решения

Указывает на тему

  • Вы можете назвать только одну функцию 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)

0

По вопросам рекламы [email protected]