3

これは私の最初の質問であり、私を困惑させたものです。これが単純なものなのか、見落としているのか、それとも不可能なのかはわかりません。

以下は、元のコードの非常に単純化されたバージョンです。最終的な目標は、出力を次のようにすることです。

1: 
2: this is a test
3: this is another test
4: this is another test

ただし、コードを現在の状態にすると、実際の出力は次のようになります。

1: 
2: this is a test
3: this is another test
4: 

first_function() によって変更された後、オブジェクト 'B' が test_variable の値にアクセスできるようにしたいと考えています。

test_variable を static として宣言すると正常に動作しますが、実際のアプリケーションでは動作せず、parent::test_variable をエコーし​​ようとすると「オブジェクト ID #17」などを出力します。

class A
{
    public $test_variable;

    function __construct()
    {
        echo '1: ' . $this->test_variable . "<br />";
        $this->test_variable = 'this is a test';
        echo '2: ' . $this->test_variable . "<br />";
    }

    function first_function()
    {
        $this->test_variable = 'This is another test';
        echo '3: ' . $this->test_variable . "<br />";
        $b = new b;
        $b->second_function();
    }
}



class B extends A
{
    function __construct()
    {
        /* Dont call parent construct */
    }

    function second_function()
    {
        echo '4: ' . $this->test_variable;
    }
}

$a = new A;
$a->first_function();

// Outputs:
// 1:
// 2: this is a test
// 3: this is another test
// 4: 

// but I want it to output
// 1: 
// 2: this is a test
// 3: this is another test
// 4: this is another test

ご回答ありがとうございます。とても感謝しています。

フィル

4

1 に答える 1

2

クラス内で宣言public $test_variable;するということは、クラスの各インスタンス (オブジェクト) にコピーがあることを意味します。$test_variableクラス A の は、クラス B と同じメモリ アドレスを指していません$test_variable。これは、スコープを許可し、グローバルな状態を削除するために意図的に行われます。前に言ったように、各インスタンスが同じ変数を共有するため、静的に宣言すると機能します。

この例で$test_variableは、本質的に、クラス B が必要とする依存関係です。その依存関係は、コンストラクター インジェクションを介してかなり簡単に取得できます。

class A
{
    public $test_variable;

    function __construct()
    {
       echo '1: ' . $this->test_variable . "<br />";
       $this->test_variable = 'this is a test';
       echo '2: ' . $this->test_variable . "<br />";
    }

    function first_function()
    {
       $this->test_variable = 'This is another test';
       echo '3: ' . $this->test_variable . "<br />";

       // Instantiate instance passing dependency
       $b = new b($this->test_variable);

       $b->second_function();
    }
}

class B extends A
{
    function __construct($dependency)
    {
       // Set dependency
       $this->test_variable = $dependency;
    }

    function second_function()
    {
       echo '4: ' . $this->test_variable;
    }
}

$a = new A;
$a->first_function();

したがって、これは、これをどのように処理することを検討するかについての単なる考えです。

于 2012-08-01T19:00:21.163 に答える