Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Закрыть private переменные
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
Добрый день!
А есть ли способ закрыть возможность вывода приватных переменных объекта через print_r(), да и var_dump() и любым другим способом тоже?
Ну, т.е. не хочу, чтобы закрытые переменные класса можно было считать таким способом. __set_state(), __debugInfo() знаю. __debugInfo() только начиная с 5.6 работает. К тому же вряд ли она закроет print_r().
DeepVarvar
Отправлено: 25 Апреля, 2015 - 14:45:45
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
DeepVarvar пишет:
Нафига?
Говнокод прятать?
Я давно заметил, что у части разработчиков с опытом развивается самокритика.
Но это не ответ на вопрос. Это даже не попытка... Потому что вопрос ты не понял. Ты можешь с помощью var_dump или print_r прочитать код?
Вопрос в том, зачем создавать private переменные, если их можно считать? Функцию ты не запустишь, а переменные - пожалуйста, вот они. В чем тогда смысл делать их приватными? Для чего разработчики php делили переменные на public, protected и private? Только, чтобы их нельзя было изменить?
Получается, что как только ты делаешь переменную доступной для всех функций внутри класса, она сразу становится доступной для чтения извне. Я нахожу это глупостью, если не предусмотрен механизм такое поведение изменить. Я понимаю, что для отладки это удобно, но в дальнейшем это превращается в косяк. С моей точки зрения...
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Ну вы бы ещё про сериализацию вспомнили. Там можно даже менять приватные переменные, не то что читать из значения.
А уж про возможность менять приватные члены в рантайме тупым closure::bindto я даже не говорю.
Если человек захочет сделать глупость - он её сделает. Поэтому не занимайтесь борьбой с ветряными мельницами. Если хочется влезть в потроха - это сделают.
----- PostgreSQL DBA
MAXUS
Отправлено: 26 Апреля, 2015 - 14:34:21
Посетитель
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
Мелкий пишет:
Ну вы бы ещё про сериализацию вспомнили. Там можно даже менять приватные переменные, не то что читать из значения.
А уж про возможность менять приватные члены в рантайме тупым closure::bindto я даже не говорю.
Если человек захочет сделать глупость - он её сделает. Поэтому не занимайтесь борьбой с ветряными мельницами. Если хочется влезть в потроха - это сделают.
Не. Это не борьба с мельницами. Я как раз спросил, чтобы понять - это мельница или нет?
Ну, и вопрос просто логики. Для чего нужны private переменные? В чем их суть? (Добавление)
Мелкий пишет:
Ну вы бы ещё про сериализацию вспомнили. Там можно даже менять приватные переменные, не то что читать из значения.
А уж про возможность менять приватные члены в рантайме тупым closure::bindto я даже не говорю.
Если человек захочет сделать глупость - он её сделает. Поэтому не занимайтесь борьбой с ветряными мельницами. Если хочется влезть в потроха - это сделают.
А static переменные можно каким-то способом считать?
MiksIr
Отправлено: 26 Апреля, 2015 - 15:24:35
Забанен
Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014
Помог: 10 раз(а)
[+]
MAXUS пишет:
Ну, и вопрос просто логики. Для чего нужны private переменные? В чем их суть?
Вот с этого стоило начинать.
Что бы это понять, нужно полнимать ООП, и в первую очередь - инкапсуляцию.
Можно начать с википедии https://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)
----- self-banned
MAXUS
Отправлено: 26 Апреля, 2015 - 15:32:25
Посетитель
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
MiksIr пишет:
MAXUS пишет:
Ну, и вопрос просто логики. Для чего нужны private переменные? В чем их суть?
Вот с этого стоило начинать.
Что бы это понять, нужно полнимать ООП, и в первую очередь - инкапсуляцию.
Можно начать с википедии https://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)
По-моему, вопрос как раз вызван тем, что подобное поведение противоречит принципам инкапсуляции:
Encapsulation can be used to hide data member and member function. Under this definition, encapsulation means that the internal representation of an object is generally hidden from view outside of the object's definition.
Я не прав?
DeepVarvar
Отправлено: 26 Апреля, 2015 - 15:40:48
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
MAXUS пишет:
Потому что вопрос ты не понял
Я все прекрасно понял. А Мелкий озвучил это явно.
Если нужно сокрытие кода ядра, только с предоставлением апи -- используй ион-куб и/или зенд-гвард.
Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014
Помог: 10 раз(а)
[+]
MAXUS пишет:
По-моему, вопрос как раз вызван тем, что подобное поведение противоречит принципам инкапсуляции:
Encapsulation can be used to hide data member and member function. Under this definition, encapsulation means that the internal representation of an object is generally hidden from view outside of the object's definition.
Я не прав?
Читайте уж все ;)
Потом осмыслить неплохо бы.
----- self-banned
MAXUS
Отправлено: 26 Апреля, 2015 - 16:42:57
Посетитель
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
MiksIr пишет:
Читайте уж все ;)
Потом осмыслить неплохо бы.
Да прочитал, в принципе Инкапсуляция - механизм, который позволяет объединить внутри объекта данные и связанные с ними функции, закрыв их от прямого внешнего изменения. Private переменные, как составляющая инкапсуляции отвечает непосредственно задаче закрыть возможность прямого доступа извне, но не отвечает задаче скрыть данные, которые а них хранятся, а попросту в большинстве языков они доступны для чтения тем или иным способом.
Поэтому вывод 1. Нефиг хранить в них то, к чему ты хочешь ограничить доступ не только на изменение, но и на чтение. Следует иметь в виду, что объявив внутри класса переменную как private вы не только предоставляете возможность другим функциям класса читать и изменять данные, но и предоставляете к таким данным доступ на чтение извне.
Вывод 2. Вернее предположение. Переменные не будут видны извне:
- только внутри scope функции (традиционно)
- или если они объявлены внутри класса как private static (вот это как раз предположение), я во всяком случае не нашел способа к таким переменным продолбиться. Например,
Если есть способ считать $v1, то подскажите, чтобы я не заблуждался (Добавление)
Мелкий пишет:
Ну вы бы ещё про сериализацию вспомнили. Там можно даже менять приватные переменные, не то что читать из значения.
А уж про возможность менять приватные члены в рантайме тупым closure::bindto я даже не говорю.
Если человек захочет сделать глупость - он её сделает. Поэтому не занимайтесь борьбой с ветряными мельницами. Если хочется влезть в потроха - это сделают.
Правильно я понимаю, что при помощи Closure::bind можно и статические переменные считать? Просто у меня php 5.3...
MiksIr
Отправлено: 26 Апреля, 2015 - 20:28:53
Забанен
Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014
Помог: 10 раз(а)
[+]
Вопрос скрыть от всех что-то, он вообoе не вопрос языка программирования, это вопрос алгоритмов.
private - это в первую очередь для удобства разработки, своеобразный синтаксический сахар.
Есть, например, питон - неплохой ООП язык, в котором нет встроенных конструкций типа private/protected. И там неплохо обходятся соглашениями в наименованиях функций (подчеркивание перед названием).
Часто язык наоборот предоставляет средства работы с такими "закрытыми" данными, например, в пхп есть рефлексия. Это иногда нужно при написании юнит-тестов, например.
По-этому вы просто двигаетесь в неверном направлении, если ваша задача - что-то от кого-то спрятать.
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
MAXUS пишет:
Правильно я понимаю, что при помощи Closure::bind можно и статические переменные считать?
Да, можно.
Для 5.3, емнип, runkit даст делать глупости. Скорей всего рефлексия даст делать глупости.
private и protected глупости делать мешают, а не исключают таковую возможность. В первую очередь это контракт, что вот эти методы и свойства мы будем читать-писать только изнутри этого класса.
----- PostgreSQL DBA
MAXUS
Отправлено: 27 Апреля, 2015 - 06:27:21
Посетитель
Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011
Помог: 7 раз(а)
MiksIr пишет:
private - это в первую очередь для удобства разработки, своеобразный синтаксический сахар.
(Добавление)
Мелкий пишет:
В первую очередь это контракт, что вот эти методы и свойства мы будем читать-писать только изнутри этого класса.
Спасибо! Щас все встало на свои места. Перестану донкихотствовать и начну жить
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.