2

PHPのクラス内でクラスを定義することはできないと言われています。しかし、私自身の例では、これはうまくいくようで、私は混乱しています。

class_test.php:

require('class_1.php');
new class_1
//Need $missing_variable here.

class_1.php

class class_1{
    public function function_1(){
        function callback_function(){
            echo "A Callback";
            $missing_variable = "Where Did I Go?";
        }
        require('class_2.php');
        new class_2('callback_function');
    }
    public function __construct(){
        $this->function_1();
    }
}

class_2.php

class class_2{
    public function __construct($callback){
        echo "Hello World - ";
        call_user_func($callback);
    }
}

class_test.phpをロードすると出力されます

Hello World - A Callback

質問:必要な場所で入手できるように定義するにはどうすればよい$missing_variableですか?


将来誰かが同様の問題を抱えている場合、それが起こりそうにない場合でも、クラスの外部からエコーされた$missing_variableを示すコードパッドに下からリンクしたいと思います。

http://codepad.org/tRk0XWG7

みなさん、ありがとうございました。


:これはフォローアップです。

4

2 に答える 2

3

関数内でクラスを宣言できます。これは条件付き宣言として知られています。つまり、関数が呼び出された場合にのみ、クラスが宣言されます。includeクラス宣言を含むファイルを使用する場合でも、関数内にコードを入力する場合でも、大きな違いはありません。

ただし、これは、クラスが任意の種類のスコープまたはデータを共有することを意味するものではありません。宣言のみが条件付きでネストされ、前に説明したのと同じ機能とスコープがあります。

コールバックについてのあなたの混乱は同じことで説明することができます。class_1::function_1が最初に実行されるとき、はfunction callback_function定義されています。これは、どこからでも呼び出すことができる通常のグローバル関数です。クラスにバインドされているわけではありません。また、2回目の実行はできないことに気付くでしょう。PHPは、再度宣言しようとすると、すでに存在しているclass_1::function_1と文句を言います。callback_function

ソースコードのコメントについて//How do I declare this variable so that it is available where I need it?:あなたはしません。その変数は、関数内のローカル変数です。関数内のスコープ内にのみあります。return必要に応じて、他の戻り値と同じように関数からその値を取得できます。(作成することはできますがglobal、神の愛のためにそうしないでください!)その値が別の場所で必要な場合は、関数内で変数として宣言しないでください。関数のみがアクセスできるためです。

于 2012-11-20T11:27:52.680 に答える
1

あなたはいくつかの場所に戻るでしょう$missing_variable。下記参照。(これはそれを行う唯一の方法ではありません、気をつけてください)

http://codepad.org/tf08Vgdx

<?
class class_2{
    public function __construct($callback){
        echo "Hello World - ";
        $missing = $callback();
        $this->missing = $missing;
    }
}
class class_1{
    public function function_1(){
        function callback_function(){
            echo "A Callback. ";
            $missing_variable = "Where Did I Go?";
            return $missing_variable;
        }
        $class2 = new class_2('callback_function');
        return $class2->missing;
    }
    public function __construct(){
        $this->missing = $this->function_1();
    }
}

$class = new class_1();

echo $class->missing;
于 2012-11-20T11:13:44.707 に答える