php polymorphism - 在多态子函数中调用父函数 - get_class($ this)的问题

时间:2011-02-22 12:33:30

标签: php object polymorphism

我创建了一个函数,可以在相关类

中可用的任何匹配变量中自动分配select中的值
class FR_Object{

    protected $me;

    public function __construct()
      {
          $this->me = new ReflectionClass($this);
      }

 public function setFrom($data)
      {
          if (is_array($data) && count($data)) {
              $valid = get_class_vars(get_class($this));
              foreach ($valid as $var => $val) {
                  if (isset($data[$var])) {
                      $this->$var = $data[$var];
                  }
              }
          }
      }
}

家长班:

class FR_Event extends FR_Object_DB {

    public $EventsID;
    public $Subject;
    public $Description;
    public $UserID;
    public $Username;
    public $Address;
    public $Longitude;
    public $Latitude;
    public $EventStartDate;
    public $EventEndDate;
    public $EventsTypeID;
    public $CountryID;
    public $CityID;
    public $Status;
    public $Lang;
    public $When;

public function getLang($lang){

        $sql = "SELECT      e.EventsID, Subject, Description, UserID, Username, Address, Longitude, Latitude, EventStartDate, EventEndDate, EventsTypeID, CountryID, CityID, Status, Lang
                FROM        Events e
                INNER JOIN  EventsDetails d
                    ON      e.EventsID = d.EventsID
                WHERE       e.EventsID = " . $this->EventsID .
               "   AND         Lang = " . $lang;


        $result = $this->selectOneRow($sql);
        if ($result) {
            $this->setFrom($result);
        }else{
            $this->Lang = null;
            $this->Subject = null;
            $this->Description = null;
        }
    }
}

儿童班:

class FR_Invitation extends FR_Event{

    public $invites;

public function getLang($lang){
        parent::getLang($lang);

        $sql = "SELECT      InvitationID, Email, InvitationDate, ConfirmationName, UserID
                FROM        Invitation i
                INNER JOIN  ConfirmationStatus s on i.ConfirmationStatusID = s.ConfirmationStatusID
                WHERE       EventsID = " . $this->EventsID .
               " AND        Lang = " . $this->Lang;

        $this->invites = $this->select($sql);
    }
}

我的问题是在子类中调用父类中的函数,如下所示:

父:: getLang($ LANG)。

parent :: getLang($ lang)使用setFrom,但此时$ this不再是父类。

这是孩子!

有人看到一种方法可以改变这个功能以便正常使用吗?当通过parent ::或者我的方法调用时,我是否必须将它扔到垃圾箱中去寻找更传统(更长)的方法?

2 个答案:

答案 0 :(得分:1)

只是不要覆盖子类中的setForm函数,它将使用它所扩展的父类中的setForm

然而,它似乎对OO继承有明显的误解。最好通过相关的documentation读取时间。

您需要使用setter注入(google it)并传递get_class_vars的结果或调用类名称。

class FR_Object {
    public function setFrom($data, $vars) {
         if (is_array($data) && count($data)) {
              $valid = $vars;
              foreach ($valid as $var => $val) {
                   if (isset($data[$var])) {
                       $this->$var = $data[$var];
                   }
              }
         }
    }
}

class FR_Invitation {
    public function setFrom($data, $vars) {
        parent::setForm($data, $vars);
    }
}

答案 1 :(得分:1)

我不明白为什么你不能保持原样。在这种情况下唯一的结果是$ {1}}呼叫也会返回$邀请。

执行您所讨论的行为的选项可能是将可选参数传递给the get_class_vars()函数。

setFrom()

然后在您的父级中,Event类将此调用用于setFrom。

public function setFrom($data, $class = null)
{
    $class = $class == null ? get_class($this) : $class;
    if (is_array($data) && count($data)) {
        $valid = get_class_vars(get_class($this));
        foreach ($valid as $var => $val) {
            if (isset($data[$var])) {
            $   this->$var = $data[$var];
            }
        }
    }
}