2

phpスクリプトがrequireまたはrequire_onceを介して別のスクリプトがそれを呼び出しているかどうかを知ることは可能ですか?

例えば:

if scripta.php calls me do xyz;
if scriptb.php calls me do abc;

編集:あなたの提案をありがとう。それは実際の問題というよりは、もしも質問でした。変数$callerを設定し、requireステートメントを作成したときにそれを更新できることに気付きました。呼び出されているファイルでこれを行う別の方法があるかどうか疑問に思いました:)

4

6 に答える 6

5

ファイルが含まれているかどうかを確認したいだけの場合:

$_SERVER['SCRIPT_FILENAME']最初に呼び出されたスクリプトのファイル名を常に返します。(例: "start.php")

定数__FILE__は、それが使用されているスクリプトの実際のファイル名を常に返します (例: "library.inc.php")。

したがって、次のようなことができます。

if ($_SERVER['SCRIPT_FILENAME'] !== __FILE__) {
    echo "script was included!";
}
else {
    echo "script was called directly!";
}

ファイルが含まれている場所を区別したい場合:

$include_from = get_included_files();
if (count($include_from) > 1) {
    $include_from = $include_from[count($include_from)-2];
}
else {
    $include_from = $include_from[0];
}
switch ($include_from) {
    case __FILE__:
        // not included, called directly
        break;
    case "/path/to/scripta.php":
        // do abc
        break;
    case "/path/to/scriptb.php": 
        // do xyz
        break;
    default:
        // do other stuff
        break;
}
于 2012-08-10T09:22:06.797 に答える
3

get_included_files()(ファイル名の配列を返す)を介して、ファイルが含まれている順序でファイルを取得できます。

  • 実行されたメイン ファイルは常に 0 番目の要素です。
  • 現在のファイルを含むファイルを探している場合は、最後から 2 つ目の要素が候補になります。
于 2012-08-10T09:25:18.487 に答える
2

get_include_files (またはget_required_files)を使用することをお勧めします。

if(in_array($my_file, get_included_files())
{
    // do something
}

$my_fileチェックする必要があるファイルに置き換えます。

于 2012-08-10T09:26:47.607 に答える
1

debug_backtrace()を使用できます

例:

インクルードされたファイルで debug_backtrace() を使用する場合:

array(1) {
    [0]=> array(3) {
        ["file"]=> string(71) "/home/index.php"
        ["line"]=> int(3)
        ["function"]=> string(7) "require"
    }
} 
于 2012-08-10T09:14:44.217 に答える
1

1 つの可能性は、定数を定義することです。

呼び出しスクリプト:

define("SCRIPT_NAME", "script_a.php");

そして、呼び出されたスクリプトで:

if(defined("SCRIPT_NAME") && SCRIPT_NAME == "script_a.php") {
    // Do stuff
}
于 2012-08-10T09:16:49.503 に答える
0

require は、require または require_once 呼び出しが呼び出された正確な場所に読み込まれたコードを切り取ったものに他なりません。

正確なファイルがそれを呼び出していることを本当に知りたい場合は、それを相対的にダーティにして、呼び出しの前に変数を割り当て、スクリプト内でどのような値があるかを確認することができます

例えば

$require_reference = "main.php";
require_once ("some_script.php");

some_script.php 内で次のようにします。

if (isset($require_reference) && $require_reference == "main.php")
{ 
    // dome something 
}

これは機能しますが、本当に面倒です。多分あなたはあなたのデザインをリファクタリングしようとするべきです

于 2012-08-10T09:17:36.633 に答える