10

次のように呼び出せる関数を作ろうとしていますが、

view( 'archive', 'post.php' );

関数が実際に行うのはこれです。

include( 'view/archive/post.php' );

この理由は、将来、ディレクトリを拡張してview/archive/another_level/post.php、コード内のどこにでも戻ってすべてのインクルードパスを変更する必要がないようにするためです。

インクルードが関数内で呼び出されており、関数が呼び出されたときに呼び出されていないように見えることを除いて、現在これは私の関数に対して持っているものです...

function view( $view, $file )
    {
        switch ( $view )
        {
            case 'archive'  : $view = 'archive/temp';   break;
            case 'single'   : $view = 'single';     break;
        }

        include( TEMPLATEPATH . "/view/{$view}/{$file}" );
    }

この関数にファイルを適切に含めるにはどうすればよいですか?

編集:

表示されているエラーはありませんでした。エラーチェックコードを提供してくれた@Rameshのおかげで、インクルードini_set('display_errors','On')されたファイルに他の「表示されていない」エラーがあり、ファイルが表示されなかったように見えました...

4

5 に答える 5

11

そのユースケースは明示的に文書化されています:

インクルードが呼び出し元ファイル内の関数内で発生した場合、呼び出されたファイルに含まれるすべてのコードは、その関数内で定義されているかのように動作します。したがって、その関数の可変スコープに従います。この規則の例外は、インクルードが発生する前にパーサーによって評価されるマジック定数です。

私見ですが、ベースパスを一定に保つ(すでにある程度は行っているようです)か、フルサイトの検索と置換(適切なエディターでは30秒のタスクです)を行う方が、含まれているものをすべて書き直すよりもはるかに簡単です。グローバル変数を使用するファイル。

于 2012-04-12T09:59:55.497 に答える
9

問題を解決する1つの方法は次のとおりです。

関数の呼び出し方法を変更して、次のようにします。

include( view('archive','post') );

関数は次のようになります。

<?php
function view( $view, $file )
{
    switch ( $view )
    {
        case 'archive': $view = 'archive/temp'; break;
        case 'single' : $view = 'single';       break;
    }

    return TEMPLATEPATH . "/view/{$view}/{$file}";
}
?>
于 2013-11-30T04:31:48.740 に答える
2

可変スコープについて読むべきだと思います。

http://php.net/manual/en/language.variables.scope.php

変数のスコープは、変数が定義されているコンテキストです。

したがって、関数内にファイルを含めると、その関数のコンテキストでのみその内容を使用できるようになります。

于 2012-04-12T09:56:42.673 に答える
2

あなたが抱えている正確な問題が何であるかを実際に述べているわけではありませんが、含まれているファイルで変数が利用できないのではないかと思います。この問題を部分的に解決するための少し恐ろしい方法は、includeステートメントの前に次の行を追加することです。

extract($GLOBALS);

これにより、すべての変数がグローバルスコープから関数にインポートされます。ただし、これでは関数が希望どおりに動作するわけではありません。このコードを考えてみましょう:

function some_func () {
  $x = 2;
  view('archive', 'post.php');
}

$x = 1;

some_func();

インクルードされたファイルでは、の値は、あなたが望む/期待する$xもの1ではなく、になります。2これは$GLOBALS、グローバルスコープのデータのみが含まれ、スコープの変数は含まれないためですsome_func()。PHPの「親」スコープの変数にアクセスするためのメカニズムはありません。

これの短所の長所は、使用したいアプローチ(関数でラップする)が機能しないことです。

于 2012-04-12T09:58:44.470 に答える
1
function view( $view, $file )
{
    switch ( $view )
    {
        case 'archive'  : $view = 'archive/temp';   break;
        case 'single'   : $view = 'single';     break;
    }

    include( TEMPLATEPATH . "/view/".$view."/".$file );
}

これは私のために働きます。また、ケース内にインクルードを使用することも、毎回ケース内にインクルードするようにURL全体を作成することもできます。

于 2012-04-12T10:01:26.200 に答える