![](/img/trans.png)
[英]php polymorphism - Call a parent function in polymorphed child function
[英]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.