0

PHP でよく使用するパターンは、いくつかのグローバル ( 、 、 など) を設定し、$pageそれら$user$dbグローバルを使用するファイルをインクルードすることです。ただし、これにグローバルを使用するという考えは好きではなかったので、より良い方法を探しています。

明らかな解決策は、サブファイルでクラスまたは関数を定義し、ファイルがインクルードされた後に呼び出すことです。ただし、次のように機能しない場合があります。

// Add entries to a URI table from each section of the site
global $router;
$router = new VirtualFileSystem();
$sections = array('store', 'forum', 'blog');
foreach($sections as $section)
    include dirname(__FILE__) . $section . '/routing.php';

// Example contents of 'forum/routing.php'
// implicitly receive $router from caller
$router->add('fourm/topic/', 'topic.php');
$router->add('forum/topic/new/', 'new_topic.php');
// etc

それぞれを関数にラップrouting.phpして、それぞれを引数として呼び出そう$routerとすると、同じ関数名が複数のファイルで定義された後に衝突します。

私はアイデアがありません。グローバル名前空間を汚染することなく、インクルードされたファイルに変数を渡すより良い方法はありますか?

4

4 に答える 4

2

includeそしてその兄弟は基本的に単なるコピー&ペースト ヘルパーであり、その中のコードは呼び出しブロックとスコープを共有します - あたかもincludeステートメントがある場所にコピー アンド ペーストするかのように。#includeそれらを使用する正しい方法は、C using、C#、またはJava で使用するのと同じ方法でそれらを考えることですimport。後で参照するコードをインポートします。インクルード ファイルにパラメーターが必要なコードがある場合は、それを関数でラップし、パラメーターを関数の引数に入れ、include_onceインクルード ファイルの先頭で使用し、必要な場所で必要なパラメーターを指定して関数を呼び出します。 . グローバルは必要ありません。経験則として、通常の操作では、何かを「行う」(グローバルスコープでステートメントを実行する) コードをインクルードファイルに入れることは、IMO を避けるのが最善です。

于 2010-12-17T13:21:07.113 に答える
1

いいえ、ありません。とにかく、インクルードされたファイルに変数を渡していません。含まれているコードは、includeステートメントが記述されている場所に記述されているかのように動作します。そのため、インクルードされたファイルに変数を渡すのではなく、ファイル内のコードは、includeステートメントが配置されている場所であればどこでもスコープ内にある変数を使用できます。

あなたの場合、の内容はforum/routing.php実際にはスタンドアロンコードではなく、正しく機能するように非常に特別に設定されたスコープに依存するコードスニペットです。それは良くないね。インクルード可能なファイルは、インクルードコードに結合しない方法で作成する必要があります。たとえば、ルーターを静的クラスにして、次のように静的に呼び出すことができますforum/routing.php

require_once 'virtual_file_system.class.php';
VirtualFileSystem::add('forum/topic/', 'topic.php');

アプリにクラスがある限りVirtualFileSystem、これは機能し、名前空間を汚染することはありません。

于 2010-12-17T13:25:13.550 に答える
1

関数内のインクルードを分離するだけです:

function add_entries_to_router($router, $sections) {
    foreach($sections as $section)
        include dirname(__FILE__) . $section . '/routing.php';
}

$router = new VirtualFileSystem();
add_entries_to_router($router, array('store', 'forum', 'blog'));
于 2010-12-17T13:30:13.000 に答える
0

構成クラスをシングルトンとして作成し、必要なときにそれを取得することで、OOP の方法を試すことができます。

__get と __set のマジック メソッドを定義して、それらをプライベート配列 var に追加し、コンストラクターをプライベートにすることができます。

私は通常、src プロジェクトへのパスのみを定数として定義して、クラス ファイルをすばやく適切にロードします (また、いくつかの SPL も使用します)。

しかし、呼び出し元ファイル (インクルードを作成したファイル) にいる場合のように、インクルードが環境変数を保持するという事実については、@tdammers に同意します。

于 2010-12-17T13:27:58.740 に答える