2017-01-11 7 views
-1

申し訳ありませんが、私はかなりコードをダウンダンプしました... 私が達成しようとしていることが可能かどうかわかりません。関数内でインクルードするとき、インクルードの前に宣言された変数にアクセスするにはどうしたらいいですか?

私は、私は1つのパラメータ

Class Example{ 
    public function Template($root){ 
     include ROOT."/templates/{$root}.php"; 
    } 
} 

私は製品の配列を持っていテンプレートと呼ばれる機能を用いて、実施例と呼ばれるクラスクラスをインスタンス化し、ここで

$products = array("garbage"); 
$test = new Example; 
$test->Template("product"); 

テンプレート関数を実行しました/templates/product.phpのコピー例です。

print 'Test'; 
print_r($products); 

私は戻ってきます"Test"と表示されるが、テンプレート機能の前に定義された$products配列にアクセスすることはできません。

私が直接include ROOT."/templates/product.php";ルートに行くと、すべて動作します。

関数内からincludeを使用することはできませんか?

+0

これは配列です(またはそうでなければなりません) 固定 – FuckYou

+0

問題はありません。質問を理解できませんでした。なぜなら、私が直接インクルードで結果を得ることができたからです明らかに、配列は配列であり、あたかも既に定義されているかのように、ここではホルダーとして配置されただけです。とにかく、ありがとう。私はこれを更新しました – FuckYou

+1

'正しい'答えは、コンストラクタを介してクラスに配列を渡すことです...しかし、グローバル$製品;あなたが$製品を使用しているファイルの先頭に... ....これは非常に非常に多くの眉をひそめている - 私はそれを示唆するために自分自身が嫌いです! – Brian

答えて

3

さてあなたはglobalsためつもりなら、他の答えは常に$productsを使用するだろうと思われます。あなたは'user'$usersを渡すことができますので、ここでは動的な方法は、など利用できるようになる...

Class Example{ 
    public function Template($root){ 
     ${$root.'s'} = $GLOBALS["{$root}s"]; 
     include ROOT."/templates/{$root}.php"; 
    } 
} 

しかし、あなたは変数を渡すと内部標準の名前を使用したほうが良いでしょう(「s」を追加)、あります

:あなたは本当にその後、連想配列として渡す検討し、何らかの理由で $productsのような特定の名前が必要な場合は

Class Example{ 
    public function Template($root, $data){ 
     include ROOT."/templates/{$root}.php"; 
    } 
} 

$products = array("garbage"); 
$test = new Example; 
$test->Template("product", $products); 

:機能、この場合は$dataとすべてのテンプレートは$dataを使用します

Class Example{ 
    public function Template($root, $data){ 
     extract($data); 
     include ROOT."/templates/{$root}.php"; 
    } 
} 

$products = array("garbage"); 
$test = new Example; 
$test->Template("product", compact("products"); 
+0

私はコメントに記載されているように他の答え –

1

あなたの問題は、変数$ productがグローバルスコープで定義されており、関数内にファイルを含めるということです。そのため、ファイルは関数のローカルスコープの$ product変数を参照します。

はこれを試してみてください。

Class Example{ 
     public function Template($root){ 
      global $products; 
      include ROOT."/templates/{$root}.php"; 
     } 
    } 
+0

ありがとうございます! 上記のブライアンは、これは怒られていると述べました。 – FuckYou

+0

http://stackoverflow.com/questions/8715897/why-is-it-considered-bad-practice-to-use-global-reference-inside-functions – Brian

+1

それは変数の範囲のためです。すべての変数は、いくつかのスコープのローカルスコープにあります。グローバルスコープで定義されたものはグローバル変数です。しかし、内部関数では、グローバルスコープはローカルスコープによって変更され、グローバルスコープの変数を使用することを宣言するまで、グローバル変数はアクセスできません。 –

関連する問題