2015-06-27 2 views
1

Не уверен, если это связано с модулем я установил или нет, я попытался удалить все расширения у меня есть, но это по-прежнему не работает:php 5.4 игнорирование определенных() в включает?

//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(); 

приводит к ошибке дубликата разрешения. Похоже, что другие проверки, такие как function_exists, будут работать, но это немного бесполезно.

ответ

1

Согласно 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(); 
1

Попробуйте

//test1.php 
if(!defined("TEST1")) { 
    define("TEST1",1); 
    function test() {} 
} 

//test2.php 
if(!defined("TEST1")) { 
    define("TEST1",1); 
    function test() {} 
} 

//test.php 
include_once('test1.php'); 
include_once('test2.php'); 
test(); 
Смежные вопросы