Переменные динамического класса

Есть ли в PHP метод автоматического создания переменных класса? Я считать Я видел нечто подобное раньше, но не уверен.

public class TestClass {
    private $data = array();

    public function TestClass() {
        $this->data['firstValue'] = "cheese";
    }
}

Массив $this->data всегда является ассоциативным массивом, но их ключи меняются от класса к классу. Есть ли жизнеспособный способ получить доступ к $this->data['firstValue'] из $this->firstValue без необходимости определять ссылку?

И если да, то есть ли у него минусы?

Или существует статический метод определения ссылки таким образом, чтобы он не взорвался, если массив $this->data не содержит этого ключа?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
6
0
8 144
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Смотрите здесь: http://www.php.net/manual/en/language.oop5.overloading.php

Вам нужен метод «__get». По ссылке есть пример того, что вам нужно.

Используйте «волшебный» метод PHP5 __get(). Это будет работать так:

public class TestClass {
    private $data = array();

    // Since you're using PHP5, you should be using PHP5 style constructors.
    public function __construct() {
        $this->data['firstValue'] = "cheese";
    }

    /**
     * This is the magic get function.  Any class variable you try to access from 
     * outside the class that is not public will go through this method.  The variable
     * name will be passed in to the $param parameter.  For this example, all 
     * will be retrieved from the private $data array.  If the variable doesn't exist
     * in the array, then the method will return null.
     *
     * @param string $param Class variable name
     *
     * @return mixed
     */
    public function __get($param) {
        if (isset($this->data[$param])) {
            return $this->data[$param];
        } else {
            return null;
        }
    }

    /**
     * This is the "magic" isset method.  It is very important to implement this 
     * method when using __get to change or retrieve data members from private or 
     * protected members.  If it is not implemented, code that checks to see if a
     * particular variable has been set will fail even though you'll be able to 
     * retrieve a value for that variable.
     *
     * @param string $param Variable name to check
     * 
     * @return boolean
     */
    public function __isset($param) {
        return isset($this->data[$param]);
    }

    /**
     * This method is required if you want to be able to set variables from outside
     * your class without providing explicit setter options.  Similar to accessing
     * a variable using $foo = $object->firstValue, this method allows you to set 
     * the value of a variable (any variable in this case, but it can be limited 
     * by modifying this method) by doing something like:
     * $this->secondValue = 'foo';
     * 
     * @param string $param Class variable name to set
     * @param mixed  $value Value to set
     * 
     * @return null
     */
    public function __set($param, $value) {
        $this->data[$param] = $value;
    }
}

Использование волшебных конструкторов __get, __set и __isset позволит вам контролировать, как вы хотите, чтобы переменные были установлены в классе, сохраняя при этом все значения в одном массиве.

Надеюсь это поможет :)

Другие вопросы по теме