powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP - как скрыть приватные свойства в дампе?
24 сообщений из 24, страница 1 из 1
PHP - как скрыть приватные свойства в дампе?
    #38895477
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Время от времени использую print_r.
Но в дампе выводятся все свойства объекта, в том числе и private/protected. А это иногда не нужно, в приватных переменных класса у меня хранятся вспомогательные данные, которые загромождают вывод.
Можно ли сделать так, чтобы в дампе были только публичные свойства? А в идеале, чтобы для приватных свойств не выводилось их значение.
Я пока приемлемого решения так и не нашел.

1. Можно выполнить var_dump(get_class_vars(get_class($object))), будут отображены нужные мне свойства, но без содержания. Можно, конечно, потом пройтись по этим свойствам и получить значения из объекта, но не хотелось бы городить свой дампер.

2. Можно в классе реализовать метод __debugInfo, но это применимо только в var_dump, а мне удобнее пользоваться print_r. Кроме того, это работает только в PHP >= 5.6, а у меня PHP 5.4.

3. В интернете я встречал советы по перехвату __get. Но во-первых, это будет работать только с объектами (а я бы хотел универсальный дампер, подходящий и для массивов), а во-вторых, это чревато глюками и тормозами.

4. Встречал интересный подход, когда данные хранятся не в приватных переменных класса, а в статических переменных методов класса. Но это не очень удобно использовать.

5. Встречал также подход, когда для хранения данных используются анонимные функции, которые не сериализируются, но это тоже неудобно.

В идеале мне нужно просто свойство "hide_private_values=true", может быть что-то такое готовое уже есть?

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38895602
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

странный вопрос. на то он и дамп чтоб выводить все что есть
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38895611
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.но не хотелось бы городить свой дампер.
не устраивает стандартный - пиши свой
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38895623
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uна то он и дамп чтоб выводить все что есть
В чем странность?
Допустим я не хочу, чтобы в var_dump($GLOBALS) было видно конфиденциальные данные.
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38895627
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Допустим я не хочу, чтобы в var_dump($GLOBALS) было видно конфиденциальные данные.
а как var_dump узнает что там конфиденциально а что нет?
всякие protected и private это просто область видимости на уровне классов. дампу пох на это. он работает с внутренним представлением
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38895633
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.чтобы в var_dump($GLOBALS) было видно конфиденциальные данные.
храни их зашифрованными или в другом месте
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38895657
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилхрани их зашифрованными или в другом месте
Они мне нужны именно в классе, а не где-нибудь в другом месте.
Кроме того, не везде я это могу контролировать — если в классе есть $dbh (пусть даже и приватный), то в дампе будут видны все параметры подключения, за исключением разве что пароля.
Если делать так:
Код: php
1.
2.
3.
4.
5.
6.
public function db($db=false)
{
    static $store;
    if ($db!==false) $store = $db;
    return $store;
}


и соответственно вместо $this->db использовать $this->db(), то это проблему решает.
Но это не очень удобно.
Кроме того, данные могут быть не конфиденциальными, но объемными (например большой массив), что затрудняет чтение дампа.
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38895687
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.Изопропилхрани их зашифрованными или в другом месте
Они мне нужны именно в классе, а не где-нибудь в другом месте.
Кроме того, не везде я это могу контролировать — если в классе есть $dbh (пусть даже и приватный), то в дампе будут видны все параметры подключения, за исключением разве что пароля.
Если делать так:
Код: php
1.
2.
3.
4.
5.
6.
public function db($db=false)
{
    static $store;
    if ($db!==false) $store = $db;
    return $store;
}


и соответственно вместо $this->db использовать $this->db(), то это проблему решает.
Но это не очень удобно.
Кроме того, данные могут быть не конфиденциальными, но объемными (например большой массив), что затрудняет чтение дампа.
Не совсем понятно, что вы хотите скрыть? Параметры подключения в текущем классе? Используйте тогда singleton для подключения к базе.
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38895728
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подключение к БД. «Соль» для хеша. Абсолютные пути к файлам. SQL-запросы.
Много разной информации, которая будет использоваться внутри класса, но которую нежелательно показывать снаружи.
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38895732
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Много разной информации, которая будет использоваться внутри класса, но которую нежелательно показывать снаружи.
где снаружи? и кому?
дампы долны видеть разработчики и админы, которые и так имеют доступ везде.
или у вас дампы постоянно вываливаются простым посетителям сайта? ))
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38895740
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.Подключение к БД. «Соль» для хеша. Абсолютные пути к файлам. SQL-запросы.
Много разной информации, которая будет использоваться внутри класса, но которую нежелательно показывать снаружи.
Не совсем понятно, что значит не показывать? Если хотите, что бы небыли доступны в клиентском интерфейсе, то делайте свойства и методы приватными.
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38895902
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r uили у вас дампы постоянно вываливаются простым посетителям сайта? ))
Разумно будет подстраховаться.
Нельзя исключать того, что какой-нибудь злоумышленник сможет выполнить на сервере phpinfo() или var_dump($GLOBALS), не получив при этом доступ к системе.
Закрыть доступ извне к приватным свойствам модуля будет неплохой подстраховкой.

kunaksergeyНе совсем понятно, что значит не показывать? Если хотите, что бы небыли доступны в клиентском интерфейсе, то делайте свойства и методы приватными.
Они и сделаны приватными, и обратиться к $obj->dbh нельзя. Но если сделать var_dump($obj), то содержимое $obj->dbh будет отображено.
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38895918
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Нельзя исключать того, что какой-нибудь злоумышленник сможет выполнить на сервере phpinfo() или var_dump($GLOBALS), не получив при этом доступ к системе.
если злоумышленник может все это делать - то он может делать и еще много всего. и вардамп ему просто будет ненужен. он просто сольет себе конфиги с паролями и хакнет все до чего доберется. кастомный вардамп тут непоможет никаким боком.
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38896358
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

не морочте себе и другим голову. если вам чтото и нужно из этой епархии, то это серилизация данных и соответсвующий магический метод у класса. ну раз по версии вардампинфо не подходит
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38899940
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Со странным поведением столкнулся.

Есть трейт для инкапсуляции данных:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
trait PrivateStore
{
        protected function _store($name, $value=null, $unset=null)
        {
                static $store;
                if (!isset($store)) $store = array();
                if (!array_key_exists($name, $store)) $store[$name] = null;
                if (isset($value) || isset($unset)) $store[$name] = $value;
                if (isset($unset)) unset($store[$name]);
                if (!isset($unset)) return $store[$name];
        }

}



Есть класс Payment:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
class Payment
{

        use PrivateStore;

        public $id;
...
        public function __construct($bm)
        {
                // $bm - ссылка на подключение к БД
                if (isset($bm) && is_a($bm, 'Billing'))
                {
                        $this->_store('bm', $bm);
                }
        }

        public function __destruct()
        {
                $this->_store('bm', null, true);
                $this->clear();
        }

        public function load($id)
        {
                $bm = $this->_store('bm'); // ссылка на подключение к БД
                $this->clear();
                $item = <SQL-запрос, возвращающий строку ассоциированного массива>;
                $this->id = $item['ITEM_ID'];
                $this->name = $item['NAME'];
...
                return true;
        }

        public function save()
        {
                $bm = $this->_store('bm'); // ссылка на подключение к БД
                <SQL-запрос для сохранения данных в БД>;
                return true;
        }

        public function find($ext_id)
        {
                $bm = $this->_store('bm'); // ссылка на подключение к БД
                $item = <select * from ... where ITEM_EXT_ID = $ext_id>;
                $result = new Payment($bm);
                if ($result->load($item['ITEM_ID']) === true) return $result;
        }



Используется это примерно так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
$bm = oci_connect(...);
$payment = new Payment($bm);
$payment->name = ...;
...
$prev = $payment->find($ext_id);
if (isset($prev))
{
    print "Запись с таким EXT_ID уже существует";
    return;
}
$payment->extId = $ext_id;
$payment->save();



Если строку с $payment->find закомментировать, то все работает нормально — данные сохраняются в БД.
Но если использовать выше приведенный код, то $payment->save не срабатывает, поскольку $bm внутри этого метода не установлен.

У меня есть предположение, что в PHP статические переменные (переменная $store внутри метода _store трейта PrivateStore) являются общими для всех экземпляров класса.
Это так или нужно искать другую причину?
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38900387
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.У меня есть предположение, что в PHP статические переменные (переменная $store внутри метода _store трейта PrivateStore) являются общими для всех экземпляров класса.
facepalm. на то они и статические переменные...
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38900405
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Статические переменные внутри методов разных объектов (а то и классов)?
Это не очень логично.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
class Class1
{
  function Foo()
  {
    static $cnt;
    $cnt++;
    print "Class1->Foo # $cnt\n";
  }
  function Bar()
  {
    static $cnt;
    $cnt++;
    print "Class1->Bar # $cnt\n";
  }
}

class Class2
{
  function Foo()
  {
    static $cnt;
    $cnt++;
    print "Class2->Foo # $cnt\n";
  }
}

$c1 = new Class1();
$c2 = new Class2();
$c3 = new Class1();

$c1->Foo();
$c2->Foo();
$c3->Foo();
$c3->Foo();
$c3->Bar();
$c3->Bar();



Код: plaintext
1.
2.
3.
4.
5.
6.
Class1->Foo # 1
Class2->Foo # 1
Class1->Foo # 2
Class1->Foo # 3
Class1->Bar # 1
Class1->Bar # 2

Признаться, я был уверен, что на третьей строке нумерация начнется сначала.
Такая особенность PHP была неожиданной.
Хорошо хоть, что в разных методах и разных классах статические переменные изолированы.
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38900416
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Признаться, я был уверен, что на третьей строке нумерация начнется сначала.
почему?
статическая переменная принадлежит классу/методу/функции а не экземпляру. все логично
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38900420
kunaksergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.,
статические переменные -это переменные класса, а не объекта.
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38900422
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

http://php.net/manual/ru/language.oop5.static.php
достаточно прочитать хоть немного, и ненужно строить никаких фантастических догадок)
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38900437
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u http://php.net/manual/ru/language.oop5.static.php
Объявление свойств и методов класса статическими позволяет обращаться к ним без создания экземпляра класса.
Со свойствами и методами класса все понятно.
Неожиданностью было то, что переменная внутри функции также рассматривается как статическая переменная класса.
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38900565
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Статические переменные внутри методов разных объектов (а то и классов)?
Это не очень логично.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
class Class1
{
  function Foo()
  {
    static $cnt;
    $cnt++;
    print "Class1->Foo # $cnt\n";
  }
  function Bar()
  {
    static $cnt;
    $cnt++;
    print "Class1->Bar # $cnt\n";
  }
}

class Class2
{
  function Foo()
  {
    static $cnt;
    $cnt++;
    print "Class2->Foo # $cnt\n";
  }
}

$c1 = new Class1();
$c2 = new Class2();
$c3 = new Class1();

$c1->Foo();
$c2->Foo();
$c3->Foo();
$c3->Foo();
$c3->Bar();
$c3->Bar();



Код: plaintext
1.
2.
3.
4.
5.
6.
Class1->Foo # 1
Class2->Foo # 1
Class1->Foo # 2
Class1->Foo # 3
Class1->Bar # 1
Class1->Bar # 2

Признаться, я был уверен, что на третьей строке нумерация начнется сначала.
Такая особенность PHP была неожиданной.
Хорошо хоть, что в разных методах и разных классах статические переменные изолированы.

это не просто нормально и логично, это что называеть - ясень пень.

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

внутрення реализация. упрощённо.

в работающем коде, есть таблица методов.
клас1
метод1-адрес1
метод2-адрес2
метод3-адрес3
клас2
...

описание типов
класс1
поле1-тип1
поле2-тип2
поле3-тип3
класс2
....

хранение обьектов
переменная1
класс1-адрес11

переменная2
класс1-адресс12

по адресу1
код-метода1

по адресу2
код-метода2
....

по адресу11
значение-поля1значение-поля2....

по адресу12
занчение-поля1значение-поля2....

из простенькой схемы видим. что для значения полей класса, используються разные ячейки оперативки, что же касаеться функций(методов) и всё что с ними связано, они храняться в единичном экземпляре в памяти, а когда ты пишешь

переменная->метод()
переменная->поле
происходит разименовывание указателя на обьект
для поля, идеться ссылка на данные обьекта(первый байт) и для нужного поля нужный адресс(технически, в описании класса для полей идёт - поле-тип-смещение. это смещение, равно смещению от первого байта участка памяти для обьекта, к первому байту значения данного поля)
для методов аналогично, только идём в таблицу методов. и статическая переменная в функции, это часть функции, которая храниться в одной копии- не только для класса, но даже и для всех потомков, ибо в описании потомка, нет кода родительских методов, в этой таблице содержится ссылка на описание родителя, и при поиске нужного метода, если его нет в таблице класса, ищёться в родительском, и так до самого верхнего. (одна из пречин почему даже сишный оопшный код медленее работает)

я к тому что пхп тут не причём, это и есть реализация ооп. общее поведение, индивидуальные поля.

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

ЗЫ
статические переменный класса, реализованны как и методы класса побую какие - их описание и содержимое храниться в описании и содержимом класса, а в каждом обьекте есть лиш указание на это дело - потому оно и общее.

ЗЫЗЫ
есть есчо познее статическое связывание, как и виртуальные методы,есчё динамические(похоже на виртуальные, но реализация другая)...всё это выливаеться в то, что

в описании родителя будет поле/метод, и в описании потомка будет тоже саммое. а как описано выше, поиск идёт по принципу - ищём в текущем классе, если нету то у родителя..но так как продублировано (познее статическое связывание, динамический метод, переопределение родительского метода) то к родителю уже поиск не пойдёт.

===
всё выше написано в целом, без привязки к пхп, более того, ввиду что пхп интерпретируемый язык а не компилируемый, там может быть даже по другому... но общая суть таже.
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38900615
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В моем примере метод Foo не статический.
Поэтому я и предполагал, что его внутреннее состояние (равно как и все его внутренние переменные, в том числе и статические) будут для каждого экземпляра класса свои.
Это оказалось не так, буду теперь учитывать.
...
Рейтинг: 0 / 0
PHP - как скрыть приватные свойства в дампе?
    #38901005
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.В моем примере метод Foo не статический.
Поэтому я и предполагал, что его внутреннее состояние (равно как и все его внутренние переменные, в том числе и статические) будут для каждого экземпляра класса свои.
Это оказалось не так, буду теперь учитывать.

этим пхп сообщество грешит с первых дней своей жизни. сначала перепутать термины все, потом путаться в мыслях. новоприбывающим вообще без вариантов разобраться в этой куче.

ваш метод фуу не статический, это метод класса, в пхп нет статичеких методов, точно также как нету свойсв у класов, есть только поля. но ...как уже сказал выше, желание понтануться дало слова, которые не позволяют возможности понять глубоко мысль(особеность сознания - человек легко понимаем мысль, если используються один и теже слова, а не куча разных слов, которые интуитивно несут разный смысл, вот любой понимает что свойство и поле это несколько разные вещи...поле, это место, ячейка, выделенный участок, свойство же - это способность, качество, черта... ну явно разные термины. использование их в пхп в перемешку приводит к тому что никто не задумывается, а что же это такое.... бквоска после стрелочки...)
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP - как скрыть приватные свойства в дампе?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]