0

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

興味深いことに、require_once()とexitが呼び出される前に、関数x()がスクリプトに登録されるため、exitが起動されます。ステートメントは、ページ内の関数の登録を妨げません。したがって、require_once()ファイルに関数x()があると、スクリプトがクラッシュします。

私が試みているシナリオ(つまり、元のファイルの代わりにカスタムファイルが存在する場合はそれを使用します。これはほぼ同じですが、わずかに異なる可能性があります)のため、元の(呼び出し)ファイルの関数を使用しないでください。カスタムファイルに存在するように登録します。

誰もがこれを達成する方法を知っていますか?

ありがとう

4

2 に答える 2

2

function_exists関数を使用できます。http://us.php.net/manual/en/function.function-exists.php

if (!function_exists("x")) {
    function x()
    {
        //function contents
    }
}
于 2009-11-26T04:42:57.803 に答える
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'
于 2010-12-02T03:30:51.067 に答える