0

我想通过调用 B 类中的函数 replace 来替换 A 类中的一个变量。例如,在下面的代码中,我想将 'hi' 替换为 'hello' 但输出是 'hi'
PS:B 类是某个控制器,必须在 A 类中获取实例.
我正在使用 php 5.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 回答