@antonowano
Профессиональный самоучка

Как получить массив атрибутов класса используя get_object_vars в родителе?

Вопрос в теме. Ситуация такова:
class Catalog extends Table {
  private $type;
  private $desc;
}
abstract class Table {
  public function __toString() {
    $vars = get_object_vars();
    return implode(', ', $vars);
  }
}


Дополнение: Хотел вынести повторяющийся код в родительский класс, но вот беда, get_object_vars возвращает свойства не Catalog, а Table. Может кто подскажет грамотное решение.
  • Вопрос задан
  • 414 просмотров
Решения вопроса 1
nonlux
@nonlux
Melkij +1
родительский класс не будет видеть private метод объявленные в наследниках.
На пальцах ООП тут работает так:
Catalog->__toString() на сам деле работает так Catalog::parent->__toString() (т.е функция вызывается в контексте Table)
Если уж очень хочется именно через get_object_vars, то он должен вызываться у наследников. Как вашем комментарии или так:
<?php                                                                                                                                                                                       
                                                                                     
  class Catalog extends Table {                                                      
    private $type;                                                                   
    private $desc;                                                                   
    protected $prot;                                                                 
    public $pub;                                                                     
                                                                                     
    protected function getMetods() {                                                 
      $vars = get_object_vars($this->self);                                          
      return array_keys($vars);                                                      
    }                                                                                
                                                                                     
  }                                                                                  
                                                                                     
  abstract class Table {                                                             
    public $perPub;                                                                  
    protected $perProt;                                                              
    private $perPriv;                                                                
    protected $self;                                                                 
    abstract protected function getMetods();                                         
    public function __toString() {                                                   
      return implode(', ', $this->getMetods());                                      
    }                                                                                
  }                                                                                  
                                                                                     
  $o=new Catalog();                                                                  
                                                                                     
  echo (string) $o;
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@SergeyZelensky-Rostov
какой код у Вас в данном случае повторяется?
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
php.net/manual/en/function.get-object-vars.php
Gets the accessible non-static properties

private - не accessible для родительского класса.

Всякие странные вещи обычно делают рефлексией.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы