2009-11-26 2 views
0

Я заметил, что поведение в PHP имеет смысл, но я не уверен, как обойти его.Php exit function question

У меня есть длинный сценарий, что-то вроде этого

<?php 
if (file_exists("custom_version_of_this_file.php")) { 
    require_once "custom_version_of_this_file.php"; 
    exit; 
} 
// a bunch of code etc 
function x() { 
    // does something 
} 
?> 

Интересно, что функция х() будет регистрироваться с помощью сценария ДО require_once() и выхода называется, и, следовательно, стрельбой из Выход; утверждение не препятствует регистрации функций на странице. Поэтому, если у меня есть функция x() в файле require_once(), скрипт выйдет из строя.

Из-за сценария, который я пытаюсь (то есть, используйте собственный файл, если он существует вместо исходного файла, который, вероятно, будет почти идентичным, но немного отличается), я хотел бы иметь функции в оригинале (вызывающий) файл НЕ регистрируется, чтобы они могли существовать в пользовательском файле.

Кто-нибудь знает, как это сделать?

Спасибо

ответ

2

Вы можете использовать функцию function_exists. http://us.php.net/manual/en/function.function-exists.php

if (!function_exists("x")) { 
    function x() 
    { 
     //function contents 
    } 
} 
+0

я считал, что, но это полная противоположность того, что я хочу сделать. Я хочу, чтобы функции в пользовательском файле превзошли те, что были в оригинале - это решение делает обратное, и поскольку я уже знаю, что все они существуют, мне лучше просто удалить функции из пользовательского файла (или переименовать их). Это рабочий сценарий, но он действительно ищет способ использовать пользовательский файл без функций из исходного файла. Спасибо за ответ, хотя. – OneNerd

+0

Вы можете посмотреть библиотеку runkit (http://php.net/manual/en/book.runkit.php). Я никогда не использовал его, но у него есть функции runkit_function_remove и runkit_function_redefine. Вы можете использовать его для переопределения ваших методов на основе различных включений. Кажется, это немного опасно. –

0

Вы можете обернуть свои функции в классе и расширить его, чтобы добавить пользовательские версии.

this_file.php

 
class DefaultScripts { 
    function x() { 
     echo "base x"; 
    } 

    function y() { 
     echo "base y"; 
    } 
} 

if(file_exists('custom_version_of_this_file.php')) 
    require_once('custom_version_of_this_file.php'); 
else 
    $scripts = new DefaultScripts(); 

custom_version_of_this_file.php

 
class CustomScripts extends DefaultScripts { 
    function x() { 
     echo "custom x"; 
    } 
} 

$scripts = new CustomScripts(); 

Результаты, если файл существует

$scripts->x(); // 'custom x' 
$scripts->y(); // 'base y' 

и если это не

$scripts->x(); // 'base x' 
$scripts->y(); // 'base y'