代码之家  ›  专栏  ›  技术社区  ›  Val

PHP OOP父子关系

  •  1
  • Val  · 技术社区  · 14 年前
    class base{
     public $c = 'c';
     public $sub  = '';
     function __construct(){
        $this->sub = new sub();
     }
    }
    
    class sub extends base{
     public $ab = 'abs';
     function __construct(){
      $this->c = 'aas';
      echo 'Test';
     }
    }
    
    
    $a = new base();
    print_r($a);
    

    我想在子类中编辑基变量 $this->c = 'blabla';

    我怎样才能做到这一点?

    2 回复  |  直到 14 年前
        1
  •  1
  •   webbiedave    14 年前

    为什么不直接覆盖它:

    class sub extends base
    {
        public $ab = 'abs';
        public $c = 'blabla';
    }
    

    否则,如果需要修改实际的基属性,请使用 parent 正如Wrikken所建议的。

        2
  •  1
  •   Wrikken    14 年前

    “这不是我引以为豪的代码(不同的构造函数签名),但这可以工作(一次性使用):

    class base{
     public $c = 'c';
     public $sub  = '';
     function __construct(){
        $this->sub = new sub($this);
     }
    }
    
    class sub extends base{
     public $ab = 'abs';
     function __construct($parent){
      $parent->c = 'aas';
      echo 'Test';
     }
    }
    

    如果您更经常需要它:

    class base{
     private $parent;
     private $top;
     public $c = 'c';
     public $sub  = '';
     function __construct(base $parent = null, base $top = null){
        $this->parent = $parent;
        $this->top    = $top;
        $this->addSub();
     }
     function addSub(){
        $this->sub    = new sub($this,$this->top ? $this->top : $this);
     }
    
    }
    
    class sub extends base{
     public $ab = 'abs';
     function __construct($parent,$top){
      parent::__construct($parent,$top);
      $this->parent->c = 'aas';
     }
     function foo($bar){
        $this->top->c = $bar;
     }
     //preventing infinite recursion....
     function addSub(){
     }
    }
    

    根据实际需要,另一种设计模式可能更适合。