繁体   English   中英

OOP PHP-使用子级和其他类的父obj实例的正确方法

[英]OOP PHP - correct way to use a parent obj instance from children and other classes

我有以下代码:

class MyObj {
    private $var1;
    private $var2;
    private $var3;

    function __construct() {
        $this->var1 = FALSE;
        $this->var2 = FALSE;
        $this->var3 = 0;
    }

    function getVar1() {
        return $this->var1;
    }
    function getVar2() {
        return $this->var2;
    }
    function getVar3() {
        return $this->var3;
    }

    function setVar1($var1) {
        $this->var1 = $var1;
    }
    function setVar2($var2) {
        $this->var2 = $var2;
    }
    function setVar3($var3) {
        $this->var3 = $var3;
    }
}

class AA {
    // ...
}

class A extends AA {
    public $myobj;
    public function __construct() {
        $this->myobj = new MyObj();
    }
    public function getMyObj() {
        return $this->myobj;
    }
}

class B extends A {
    public function __construct() {
        parent::__construct();
        $this->fun1();
    }
    private function fun1() {
        $this->myobj->setVar1(TRUE);
    }
}
class C extends A {
    public function __construct() {
        parent::__construct();
        $this->fun2();
    }
    private function fun2() {
        $this->myobj->setVar2(TRUE);
    }
}

class OtherClass extends AA {
    public function __construct() {
        $B = new B();
        $C = new C();
        $C->getMyObj()->setVar3(5);

        var_dump ( $C->getMyObj()->getVar1() ); // false
        var_dump ( $C->getMyObj()->getVar2() ); // true
        var_dump ( $C->getMyObj()->getVar3() ); // 5

        echo "<br/><br/>";

        var_dump ( $B->getMyObj()->getVar1() ); // NULL 
        var_dump ( $B->getMyObj()->getVar2() ); // false 
        var_dump ( $B->getMyObj()->getVar3() ); // 0
    }
}

new OtherClass();

问题是我需要一种从OtherClass访问$this->myobj var的OtherClass ,以便从所有set()函数获取所有更新。 因此,我希望在OtherClass构造函数中得到以下结果:

var_dump ( $C->getMyObj()->getVar1() ); // true
var_dump ( $C->getMyObj()->getVar2() ); // true
var_dump ( $C->getMyObj()->getVar3() ); // 5

我也不知道将MyObj类与$C->getMyObj()一起使用是否是一种跟踪来自各种类实例( BCOtherClass )的更新的好方法。 如果没有,我接受任何提示。

谢谢

刚刚使用singleton pattern解决了问题。

问题是,调用parent::__construct(); BC ,总是会创建$this->myobj的新实例( $this->myobj = new MyObj(); ),因此我失去了$this->myobj = new MyObj();编辑。

我这样编辑代码:

class MyObj {

    private static $instance;

    private $var1;
    private $var2;
    private $var3;

    function __construct() {
        $this->var1 = FALSE;
        $this->var2 = FALSE;
        $this->var3 = 0;
    }

    function getVar1() {
        return $this->var1;
    }
    function getVar2() {
        return $this->var2;
    }
    function getVar3() {
        return $this->var3;
    }

    function setVar1($var1) {
        $this->var1 = $var1;
    }
    function setVar2($var2) {
        $this->var2 = $var2;
    }
    function setVar3($var3) {
        $this->var3 = $var3;
    }

    public static function getInstance(){
        if( !isset( self::$instance ) ){
            self::$instance = new MyObj();
        }
        return self::$instance;
    }

}

class AA {

}




class A extends AA {
    public function __construct() {

    }
}

class B extends A {
    public function __construct() {
        parent::__construct();
        $this->fun1();
    }
    private function fun1() {
        $myobj = MyObj::getInstance();
        $myobj->setVar1(TRUE);
    }
}
class C extends A {
    public function __construct() {
        parent::__construct();
        $this->fun2();
    }
    private function fun2() {
        $myobj = MyObj::getInstance();
        $myobj->setVar2(TRUE);
    }
}

class OtherClass extends AA {
    public function __construct() {
        $myobj = MyObj::getInstance();
        $B = new B();
        $C = new C();
        $myobj->setVar3(5);

        var_dump ( $myobj->getVar1() ); // true
        var_dump ( $myobj->getVar2() ); // true
        var_dump ( $myobj->getVar3() ); // 5
    }
}

new OtherClass();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM