Метод getInfo(), как тебя реализовать?

Метод getInfo() в классе SuperUser должен возвращать ассоциативный массив, в котором именами элементов массива являются имена свойств объекта, а значениями элементов - значения свойств объекта.

Как можно реализовать?

// абстрактный класс UserAbstract
abstract class UserAbstract {
    public $name;
    public $login;
    public $password;

    function __construct($name, $login, $pass){
        $this -> name = $name;
        $this -> login = $login;
        $this -> password = $pass;
    }

    function __destruct(){
        echo "Пользователь {$this->login} удален!";
    }

    // абстрактный метод
    abstract function showInfo();
}

class User extends UserAbstract{
    public $surname;

    // реализация абстрактного метода
    function showInfo(){
        echo "Name: {$this->name}\n Surname: {$this->surname}\n Login: {$this->login}\n Password: {$this->password}\n";
    }
}


// интерфейс ISuperUser
interface ISuperUser{
    // объявлен метод getInfo
    function getInfo();
}

// класс superUser наследует класс User и реализует интерфейс ISuperUser
class superUser extends User implements ISuperUser{
    function getInfo(){
        // вернуть ассоциативный массив, в котором именами элементов массива являются имена свойств объекта, а значениями элементов -значения свойств объекта

    }
}


$superUser = new superUser("Jack", "lucky_jack", 777);
$superUser -> surname = "Luckie";
$superUser -> showInfo();

Ответы (2 шт):

Автор решения: Sanya H
function getInfo(){

    $rc = new ReflectionClass($this);
    $attributes = $rc->getProperties();
    
    $result = [];
    foreach ($attributes as $attribute) {
        $name = $attribute->getName();
        $result[$name] = $this->{$name};
    }
    
    return $result;
}
→ Ссылка
Автор решения: teran

в самом простом случае можно сделать

return (array)$this;

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

→ Ссылка