2012-01-26 32 views
2

私は次のことをテストしたが動作しません。これを達成する同様の方法はありますか?テンプレートを策定PHP:関数内の関数が内部関数に含まれています

コンパイルクラス: - クラスのどこにも

private function include_header() { 
    function _metadata() { 
     // Metadata compiler 
     return $metadata; 
    } 
    include (path . "header.php"); 
} 

header.phpの

<html> 
<head> 
    <?php 
     _metadata(); 
    ?> 
    <title>Hello Stackoverflow!</title> 
</head> 
<body> 
    ... 

_metadata();機能はinclude_header();関数内でのみ使用可能です。私は$this->_metadata();をテンプレートファイル_metadata();に書き込む必要はありません。それは達成可能ですか?

外部ファイルを作成することもできます。たとえば、functions.phpのように、テンプレート用のアンダースコア機能がありますが、元のクエリが可能かどうかはわかります。

ありがとうございます。

答えて

4

the manualから:

PHPのすべての関数やクラスは、グローバルスコープを持っている - 彼らは、彼らが内部に定義された場合でも、関数の外で呼ばれると、その逆のことができます。

本質的に、あなたがしようとしていることはできません。 _metadataは、function _metadata() {構文で定義されている場合、常にグローバル関数になります。通常の関数構文はグローバル関数のみをサポートしています。

でも、PHP 5.3には"anonymous functions"というものが導入されています。これらは変数に割り当てることができます。変数のスコープにスコープすることができます(明示的にそう言えばグローバルのみです)。このようにしてスコープを制限することができます。例えば

:この少なく安定していることを

<?php $_metadata(); ?> 

注:変数を再定義するために、例えば、可能である

$_metadata = function() { 
    // Metadata compiler 
    return $metadata; 
}; 

これは、その後でheader.phpで呼び出すことができ別の匿名関数、または実際には関数ではありません。最も安全なソリューションは、最終的に、これらの問題を解決するテンプレート言語を使用することです。そうでない場合は、グローバル関数または匿名関数を使用する必要があることに同意することができます。

+0

私はこれが好きです。ありがとうございます:) – escproxy

1

PHPでネストされた関数を定義することはできません。つまり、できますが、グローバルスコープを持つため、スクリプトの任意のポイントから呼び出すことができるため、目的はありません。

しかし、あなたが実際にあなただけのinclude_header()内のすべての機能ロジックを実行して、簡単な<?php echo $metadata; ?>を含んで印刷されます変数$metadata、ですべてを保存することができ、_metadata()関数を定義する必要はありません。

実際に関数を定義する必要がある場合は、関数または(PHP> 5.3の場合)anonymous function関数を使用できます。関数スコープを持つ変数の内部にカプセル化されるため、外部では使用できません。

+0

私は 'echo'、' print'などを避けようとしています。私は関数を使いたいです。 – escproxy

+1

@Alexあなたは 'echo'、' print'などを使わなければなりません。あなたが現在持っているものは何もしません。 – Esailija

+0

私は、その機能の外にあることを意味しました。もちろん 'echo'、 'print'は関数の中にあります。それにもかかわらずありがとうございました:) – escproxy

関連する問題