我有类继承的以下情况:
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 ::不存在)。
答案 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;
}
}