Согласно PHP документации (http://php.net/manual/en/functions.user-defined.php):
Функции не должны быть определены прежде, чем они упоминаются, кроме случаев, когда функция определена условно
Это означает, что если вы не ставите ваша функция test() в условном выражении будет определена до начала запуска скрипта.
Чтобы разрешить ссылки на функции, определенные далее в коде, PHP сначала ищет файл для определения функций (классов и т. Д.), Затем запускает код. Поэтому, когда вы делаете свое:
if(defined('TEST1')) return;
Функция Te уже существует и срабатывает ошибка дублирования. Решение состоит в том, чтобы поместить их в любое условное утверждение (оно не должно иметь смысла) или даже просто в фигурных скобках. Функции, определенные таким образом, не будут определены до выполнения сценария, а также вы не сможете использовать их, если они определены. Вы можете исправить код только делая это:
//test1.php
if(defined("TEST1")) {
return;
}
define("TEST1",1);
{
function test() {}
}
//test2.php
if(defined("TEST1")) {
return;
}
define("TEST1",1);
{
function test() {}
}
//test.php
include_once('test1.php');
include_once('test2.php');
test();
Чтобы проверить поведение, которое вы можете играть с этим два фрагмента кода. Это одна будет работать:
<?php
test();
function test() {
echo 'Hello world!';
}
Но это будет не в состоянии с неопределенной функции:
<?php
test();
{
function test() {
echo 'Hello world!';
}
}
В то время как это снова будет работать:
<?php
{
function test() {
echo 'Hello world!';
}
}
test();