如何从父类访问子类变量

时间:2014-09-08 19:55:13

标签: php oop inheritance

我有类继承的以下情况:

class Entity
{
  public $db; //connection

  ...
}

和类客户产品扩展实体类:

class Customer extends Entity
{
   public $cname;
   public $cdesc;

   private function populate($row)
   {
     foreach($row as $key=>$val) $this->$key=$val;
   }

   public function fetch()
   {
     $sql="SELECT cname,cdesc FROM customers";
     $rst=$this->db->query($sql);
     $row=$rst->fetch_assoc();
     $this->populate($row);
   }
}

class Product extends Entity
{
   public $pname;
   public $pdesc;

   private function populate($row)
   {
     foreach($row as $key=>$val) $this->$key=$val;
   }

   public function fetch()
   {
     $sql="SELECT pname,pdesc FROM products";
     $rst=$this->db->query($sql);
     $row=$rst->fetch_assoc();
     $this->populate($row);
   }
}

正如我们在这里看到的,每个子类具有相同的函数 populate($ row),它从子类获取数据库行并填充相应的类'变量;此函数自动填充变量:$ this-> cname = $ row [' cname'],$ this-> cdesc = $ row [' cdesc']等。(看看我的另一篇文章here)。

现在我想将这个函数从子类拉到父类实体并由所有子类继承,但是存在问题。此函数使用 $ this-> $ key = $ val 动态填充(尝试填充)父类变量,并且我想填充子类变量。如何定义这个函数填充子类变量? (我想在这里遇到像child :: $ key = $ val,但是child ::不存在)。

3 个答案:

答案 0 :(得分:1)

如果您尝试仅通过关系尝试从另一个产品访问某个产品的特定数据,则无法执行此操作。

如果您想要从父级访问子级数据,那么我建议创建一个界面来定义获取所需数据的标准方法:

interface EntityInterface
{
    public function getName();
    public function getDescription();
}

然后您的产品只是定义方法......

class Product extends Entity implements EntityInterface
{
    public $pname;

    public function getName() {
        return $this->pName;
    }
}

您的顶级Entity类使用这些访问者:

class Entity
{
    public function printName() {
        echo $this->getName();
    }
}

答案 1 :(得分:1)

也许我错过了一些东西,但你可以让函数受到保护,然后在子类中访问它:

class Entity
{
    protected  $db; //connection

    protected  function populate($row)
    {
        foreach($row as $key=>$val) $this->$key=$val;
    }
}


class Customer extends Entity
{
    public $cname;
    public $cdesc;

    public function fetch()
    {
        $sql="SELECT cname,cdesc FROM customers";
        $rst=$this->db->query($sql);
        $row=$rst->fetch_assoc();
        $this->populate($row);
    }
}

class Product extends Entity
{
    public $pname;
    public $pdesc;

    public function fetch()
    {
        $sql="SELECT pname,pdesc FROM products";
        $rst=$this->db->query($sql);
        $row=$rst->fetch_assoc();
        $this->populate($row);
    }
}

答案 2 :(得分:0)

这是Abstract classes的用途。您可以在父类中定义所需内容,然后您的子项实现它。或多或少,这就是Joe所描述的,只是简单地进入了一个方便的类

abstract class Entity
{
    // Note that we're defining this here and not in the child 
    // so we're guaranteed this is set
    /* @var string */
    public $pName;

    public function printName() {
        echo $this->getName();
    }

    abstract public function getName($name);
}

class Product extends Entity
{
    //Note that, just like an interface, this has to implement it just like the parent
    public function getName($name) {
        return $this->pName;
    }
}