Есть ли волшебный метод, чтобы запретить var_export вытащить приватные поля класса?

Ссылка скопирована
PHP
1 ответ

Составляю задачу на Codewars, в которой необходимо передавать в пользовательскую функцию объект с методами и секретными полями, но пользователь может считерить и сдампить его, прочитав содержимое полей. Волшебными методами __sleep и __debugInfo можно запретить вытянуть эти поля через serialize и var_dump, но остаётся var_export, для которого волшебного метода не нашёл. Гугл ничего не подсказывает по этому поводу.

Дополнительно:

Не хранить переменные в виде мембера класса, а хранить как static внутри метода

  • О, отличная мысль! Как-то вроде того, или можно упростить?
    private function secret(?int $value = null) {   static $secret;   if (is_null($value)) return $secret;   else $secret = $value; }

    private function secret(?int $value = null) { static $secret; if (is_null($value)) return $secret; else $secret = $value; }

  • Да, только присвой что-нибудь $secret при инициализации.

    И засовывай туда не скалярный тип а объект, чтобы он по ссылке возвращался

    Добраться до статичных локальных переменах функций можно только отладчиком

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Сергей Миронов Ответ

Для того чтобы запретить функции var_export() выводить приватные поля класса, можно воспользоваться магическим методом __debugInfo(). Этот метод позволяет определить, какие свойства класса должны быть возвращены при вызове функции var_export().

Пример:

class MyClass {
    private $privateProperty = 'private value';
    public $publicProperty = 'public value';
 
    public function __debugInfo() {
        return [
            'publicProperty' => $this->publicProperty
        ];
    }
}
 
$obj = new MyClass();
var_export($obj);

class MyClass { private $privateProperty = 'private value'; public $publicProperty = 'public value'; public function __debugInfo() { return [ 'publicProperty' => $this->publicProperty ]; } } $obj = new MyClass(); var_export($obj);

В этом примере мы определяем метод __debugInfo() в классе MyClass и возвращаем массив только с публичным свойством publicProperty. Теперь при вызове функции var_export() будет выведено только это свойство, а приватное свойство privateProperty будет скрыто.

Таким образом, использование магического метода __debugInfo() позволяет контролировать вывод приватных полей класса при использовании функции var_export().

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно