我创建了一个函数,可以在相关类
中可用的任何匹配变量中自动分配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 ::或者我的方法调用时,我是否必须将它扔到垃圾箱中去寻找更传统(更长)的方法?
答案 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];
}
}
}
}