繁体   English   中英

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

[英]php polymorphism - Call a parent function in polymorphed child function - problem with get_class($this)

我创建了一个函数,可以在相关类中可用的任何匹配变量中自动分配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 ::或者我必须将它扔到bin并转向更传统(和更长)的方法时?

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

但是,它似乎对OO继承有明显的误解。 最好通过相关文档阅读时间。

你需要使用setter injection(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);
    }
}

我不明白为什么你不能保持原样。 在这种情况下唯一的结果the get_class_vars()调用也会返回$ invites。

执行您所讨论的行为的选项可能是将可选参数传递给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];
            }
        }
    }
}

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

$this->setFrom($result, get_class());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM