0

クラスBで関数replaceを呼び出して、クラスAの変数を置き換えたいです。たとえば、以下のコードでは、「hello」を「hi」に置き換えたいのですが、出力は「hi」です
。PS:クラスBはコントローラーであり、クラスAのインスタンスを取得する必要があります。 。
私はphp5.2.9+を使用しています

<?php
$a = new A();
class A {
    protected $myvar;

    function __construct() {
        $this->myvar = "hi";
        $B = new B();
        echo $this->myvar; // expected value = 'hello', output = 'hi'
    }

    function replace($search, $replace) {
        $this->myvar = str_replace($search, $replace, $this->myvar);
    }
}

class B extends A {
    function __construct() {
        parent::replace('hi', 'hello');
    }
}
?>
4

3 に答える 3

3

それはクラスと継承がどのように機能するかではありません。

<?php
$a = new A();
class A {
    protected $myvar;

    function __construct() {
        $this->myvar = "hi";

        /**
         * This line declares a NEW "B" object with its scope within the __construct() function
         **/
        $B = new B();

        // $this->myvar still refers to the myvar value of class A ($this)
        // if you want "hello" output, you should call echo $B->myvar;
        echo $this->myvar; // expected value = 'hello', output = 'hi'
    }

    function replace($search, $replace) {
        $this->myvar = str_replace($search, $replace, $this->myvar);
    }
}

class B extends A {
    function __construct() {
        parent::replace('hi', 'hello');
    }
}
?>

検査する$Bと、そのmyvar値は「こんにちは」になります。コード内の何もの値を変更しません$a->myvar

の宣言でオブジェクトのメンバー変数$Bを変更するA場合は、そのオブジェクトをコンストラクターに渡す必要があります。

class A {
    .
    .
    .

    function __construct() {
         .
         .
         .
         $B = new B($this);
         .
         .
         .
    }
}
class B extends A {
    function __construct($parent) {
        $parent->replace('hi', 'hello');
    }
}

注:これは継承の非常に貧弱な実装です。それはあなたがそれを「したい」ことをしますが、これはオブジェクト互いに相互作用する方法ではありません。

于 2012-08-20T15:48:29.860 に答える
2

スクリプトを少し変更するだけでうまくいきます>面倒ですが、最初に親に電話したいと思います

$a = new A();
class A {
    protected $myvar;

    function __construct() {
        $this->myvar = "hi";
        $B = new B($this);
        echo $this->myvar; // expected value = 'hello', output = 'hi'
    }

    function replace($search, $replace) {
        $this->myvar = str_replace($search, $replace, $this->myvar);
    }
}

class B extends A {
    function __construct($a) {
        $a->replace('hi', 'hello');
    }
}
于 2012-08-20T15:51:36.910 に答える
1

現在、クラスのインスタンスを作成しているAので、関数を呼び出すことはありませんB::replace()

この行を変更します:

$a = new A();

の中へ

$b = new B();
于 2012-08-20T15:48:04.630 に答える