【问题标题】:Php exit function questionphp退出函数问题
【发布时间】:2009-11-26 04:40:32
【问题描述】:

我注意到 PHP 中的一个行为是有意义的,但我不确定如何绕过它。

我有一个很长的脚本,类似这样的

<?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
 }
?>

有趣的是,函数 x() 将在 require_once() 和 exit 被调用之前注册到脚本中,因此会触发退出;声明不会阻止页面中的函数注册。因此,如果我在 require_once() 文件中有一个函数 x(),脚本就会崩溃。

由于我正在尝试的场景(也就是说,如果存在自定义文件而不是原始文件,则使用它,这可能几乎相同但略有不同),我希望拥有原始文件中的功能(调用) 文件未注册,因此它们可能存在于自定义文件中。

有人知道怎么做吗?

谢谢

【问题讨论】:

    标签: php function exit


    【解决方案1】:

    您可以使用 function_exists 函数。 http://us.php.net/manual/en/function.function-exists.php

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

    【讨论】:

    • 我考虑过,但这与我想要完成的完全相反。我希望自定义文件中的函数胜过原始文件中的函数——这个解决方案正好相反,因为我已经知道它们都存在,我最好从自定义文件中删除函数(或重命名它们)。那是一个可行的方案,但确实在寻找一种方法来使用自定义文件而无需原始文件中的功能。不过感谢您的回复。
    • 您可以查看 runkit 库 (php.net/manual/en/book.runkit.php)。我从未使用过它,但它确实具有 runkit_function_remove 和 runkit_function_redefine 功能。您可以使用它根据各种包含重新定义您的方法。不过好像有点危险。
    【解决方案2】:

    您可以将函数包装在一个类中并对其进行扩展以添加自定义版本。

    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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 2011-07-19
      • 2012-11-01
      • 2011-05-22
      • 1970-01-01
      相关资源
      最近更新 更多