2016-09-03 12 views
0

これは単なる説明の例です。発信者からのパスを取得するには

[./includes/functions.inc.php] 
function getPHPResult($path) { 
    ob_start(); 
    include $path; 
    $result = ob_get_clean(); 

    return $result; 
} 

[./pages/a.php] 
echo getPHPResult('b.php'); 

[./pages/b.php] 
some php code. 

このコードは機能しません。
a.phpの'b.php''getPHPResult'の有効なパスではないためです。

a.phpでinclude 'b.php'を使用すると、a.phpと同じディレクトリにあるb.phpが読み込まれます。
しかし、a.phpでgetPHPResult ('b.php')を使用すると、functions.inc.phpと同じディレクトリにあるb.phpが読み込まれます。
しかし、私はそうa.php

と同じディレクトリにb.phpロードしたい、私はgetPHPResult('../includes/b.php')getPHPResult('b.php')を変更する必要があります。
a.phpb.phpを別のディレクトリに移動した場合は動作しません。

次に、getPHPResult機能で正しいパスを見つけたいと思います。
私の解決策はちょうどdebug_backtraceです。

function getPHPResult($path) { 
    $backtrace = debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 2); 
    $dir = dirname($backtrace[1]['file']); 

    ob_start(); 
    include $dir . '/' . $path; 
    return ob_get_clean(); 
} 

しかし、私はそれが良い方法ではないと思います。
debug_backtraceなしで正しいパスを見つけるにはどうすればよいですか?

+0

@ Ryan Vincent私はちょうどテンプレートエンジンを作ろうとしています。トップのコードは説明するための例に過ぎません。 –

答えて

0

スクリプトの場所が変更される可能性が高い場合は、相対パスの代わりに絶対パスを使用するようにしてください。 PHPでは、あらかじめ定義されている"magic constants"があります。

__FILE__シンボリックリンクのファイルの絶対パスとファイル名が解決されました。インクルードの内部で使用された場合、インクルードされたファイルの名前が返されます。

定数__FILE__は、常にスクリプトの絶対パスとファイル名を返します。多分あなたはそれを出発点として使うことができます。

+0

しかし、呼び出し元ファイルは\ _ \ _ FILE \ _ \ _と同じではない可能性があります。 when ... index.phpにはa.phpが含まれています –

1

私は何を意味するのか分かりません。 a.phpとb.phpが同じディレクトリになります場合しかし、あなたはこの、

echo $_SERVER['PHP_SELF']; 
+0

私の悪い英語を申し訳ありません。 –

+0

関数内の呼び出し元ファイルからの相対パスを取得したい。 a.phpで 'include 'b.php'を使うと、b.phpはa.phpと同じディレクトリにあります。 'getPHPResult( 'b.php')'を呼び出すと、b.phpはfunctions.inc.phpと同じディレクトリになければなりません。しかし、私はa.phpと同じディレクトリにb.phpをロードしたいのですが、どうすれば作れますか? –

+0

これを使用して、 'echo $ _SERVER ['SCRIPT_FILENAME'];' – Sidath

0

現在実行中のPHPスクリプトの使用のファイル名を取得したい場合は、安全に、次を使用することができます。

[ a.php]

echo getPHPResult(__DIR__ . '/b.php'); 
+0

ありがとうございます。関数のパスを計算する方法は存在しませんか? –

関連する問題