By_Engine
@By_Engine

Баг? Фича? Или я что-то не понимаю?

Имеется класс для хранения данных, к которому можно обратиться отовсюду. Убрал лишнюю логику, чтобы не напрягать мозг.
class Data {
    static private $data;
    
    
    /**
     * Создать пустые объекты под переменные для удобства использовнаия
     */
    public function __construct(){
        self::$data['app'] = new \stdClass;
        self::$data['cfg'] = new \stdClass;
        self::$data['pkg'] = new \stdClass;
    }
    
    /**
     * Сохранить переменную
     *
     * @param (string) $type                Тип переменной (app|cfg|pkg)
     * @param (array|object)  $vars         Массив/объект ключей и значений
     */
    static public function set(string $type, $vars){
        if(isset(self::$data[$type]) && (is_array($vars) or is_object($vars))){
            foreach($vars as $key => $value){
                self::$data[$type] -> $key = $value;
            }
        }
    }
	
    /**
     * Получить переменную
     *
     * @param  (string) $key                Название
     * @return (object)
     */
    static public function get(string $type){
        if(isset(self::$data[$type])){
            return self::$data[$type];
        }
        
        throw new \Exception('Неизвестный тип переменной');
    }
}


new Data;

// Сохраняем новую переменную
Data::set('app', ['foo' => 'bar']);

// Получаем список всех переменных типа "app"
$app = Data::get('app');

// Изменяем значение в текущей области видимости
$app -> foo = 'new value';

var_dump(Data::get('app') -> foo); // new value (WTF?)
  • Вопрос задан
  • 211 просмотров
Решения вопроса 1
@D3lphi
А чего тут непонятного? У вас в Data::$data лежит массив с экземплярами классов stdClass. То бишь, объекты. А объекты в PHP как передаются? Правильно, по ссылке! Следовательно, изменение значения свойства этого объекта в одном месте, изменяет этот объект везде.

И да, не пишите больше таких классов. Вообще, старайтесь статику только в самом крайнем случае использовать.
Инициализировать статические свойства в конструкторе очень странно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽