php polymorphism - вызов родительской функции в polymorphed дочерней функции - проблема с get_class ($ this) - PullRequest
0 голосов
/ 22 февраля 2011

Я создал функцию для автоматического назначения значений из выбора в любых соответствующих переменных, доступных в связанном классе

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 ($ Ланг).

parent :: getLang ($ lang) использует setFrom, но в этот момент $ больше не является родительским классом.

Это ребенок!

Кто-нибудь видит способ изменить эту функцию для обычного использования и при вызове с помощью parent :: или мне просто нужно выбросить ее в корзину и перейти на более традиционные (и более длинные) методы?

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

Не понимаю, почему ты не мог оставить все как есть. Единственным последствием в этом случае будет то, что $ invites также будет возвращено the get_class_vars() call.

Вариант поведения, о котором вы говорите, может состоять в передаче необязательного параметра в функцию 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());
1 голос
/ 22 февраля 2011

Просто не перезаписывайте функцию setForm в дочернем классе, и она будет использовать setForm в родительском классе, который она расширяет.

Однако, похоже, что имеется недопонимание OOнаследование.Лучше всего, вы потратите время на прочтение соответствующей документации .

. Вам нужно использовать метод установки (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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...