PHP继承:如果A则必须设置B.

时间:2010-09-15 04:46:37

标签: php class inheritance

所以,我尝试谷歌这个,但不知道这种情况叫什么......

我正在努力第一次使用类继承,其中父类定义了一组方法,然后其他几个类扩展了该父类。

我想知道的是,有可能做到这样的事情:

class foo {
  private bar = false;
  private baz = NULL;
}

现在让我说我有:

class foobar extends foo { }

我希望能够在“foo”中有一个条件,即如果任何类扩展“foo”并设置“bar = true”则必须设置“baz”(即非空),否则抛出异常。

这样的事情可能吗?

2 个答案:

答案 0 :(得分:3)

使用您在foo中定义的magic setter function似乎可以做到这一点,但有一个严重的警告。只有当您访问无法访问的属性时,才会触发魔术吸气剂和定位器

在类中操作时,所有属性(无论是声明为私有,公共还是受保护)通常都是可访问的,因此魔术getter和setter函数不会触发。只有一个例外:在祖先类中声明为private的属性。那些将被隐藏(不可访问)到后代类,并且魔术函数将被激活。

这意味着您需要在bar中声明bazfoo。如果您在foobar中声明它们,它将无法工作,因为它们将变得可访问。

考虑到这一点,以下内容将按您的要求运行:

class foo {
  private $bar = false;
  private $baz = NULL;

  public function __set($name, $value)
   {
     if ($name == "bar") 
      { if ($value == true)
         {
           if ($this->baz == null) 
            throw new Exception();
         }
      }
   } 
}

class foobar extends foo {

     function test()
      {
       $this->bar = "TEST";   
      }

 }


 $foobar = new foobar();
 $foobar->test();  // Will throw an exception

如果您想从bar内阅读bazfoobar,您还需要定义魔术吸气功能。

答案 1 :(得分:0)

只需在第二个类中运行构造函数。

class foo {
  private bar = false;
  private baz = NULL;
  public function __construct() {
    if ($this->bar && is_null($this->baz)) // throw exception
  }
}
class foobar extends foo {
  public function __construct($baz) {
    $this->baz = $baz;
    $this->bar = true;
    parent::__construct(); // Now run the parent's constructor
  }
}

许多不同的方法......