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 переменные

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Закрыть private переменные для вывода через print_r()
MAXUS
Отправлено: 25 Апреля, 2015 - 14:43:58
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




Добрый день!

А есть ли способ закрыть возможность вывода приватных переменных объекта через print_r(), да и var_dump() и любым другим способом тоже?

Ну, т.е. не хочу, чтобы закрытые переменные класса можно было считать таким способом. __set_state(), __debugInfo() знаю. __debugInfo() только начиная с 5.6 работает. К тому же вряд ли она закроет print_r().
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Апреля, 2015 - 14:45:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Нафига?
Говнокод прятать? Ниндзя
 
 Top
MAXUS
Отправлено: 26 Апреля, 2015 - 14:09:30
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




DeepVarvar пишет:
Нафига?
Говнокод прятать? Ниндзя


Я давно заметил, что у части разработчиков с опытом развивается самокритика.

Но это не ответ на вопрос. Это даже не попытка... Потому что вопрос ты не понял. Ты можешь с помощью var_dump или print_r прочитать код?

Вопрос в том, зачем создавать private переменные, если их можно считать? Функцию ты не запустишь, а переменные - пожалуйста, вот они. В чем тогда смысл делать их приватными? Для чего разработчики php делили переменные на public, protected и private? Только, чтобы их нельзя было изменить?

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

(Отредактировано автором: 26 Апреля, 2015 - 14:31:35)

 
 Top
Мелкий Супермодератор
Отправлено: 26 Апреля, 2015 - 14:22:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Ну вы бы ещё про сериализацию вспомнили. Там можно даже менять приватные переменные, не то что читать из значения.
А уж про возможность менять приватные члены в рантайме тупым closure::bindto я даже не говорю.
Если человек захочет сделать глупость - он её сделает. Поэтому не занимайтесь борьбой с ветряными мельницами. Если хочется влезть в потроха - это сделают.


-----
PostgreSQL DBA
 
 Top
MAXUS
Отправлено: 26 Апреля, 2015 - 14:34:21
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




Мелкий пишет:
Ну вы бы ещё про сериализацию вспомнили. Там можно даже менять приватные переменные, не то что читать из значения.
А уж про возможность менять приватные члены в рантайме тупым closure::bindto я даже не говорю.
Если человек захочет сделать глупость - он её сделает. Поэтому не занимайтесь борьбой с ветряными мельницами. Если хочется влезть в потроха - это сделают.


Не. Это не борьба с мельницами. Я как раз спросил, чтобы понять - это мельница или нет? Улыбка

Ну, и вопрос просто логики. Для чего нужны private переменные? В чем их суть?
(Добавление)
Мелкий пишет:
Ну вы бы ещё про сериализацию вспомнили. Там можно даже менять приватные переменные, не то что читать из значения.
А уж про возможность менять приватные члены в рантайме тупым closure::bindto я даже не говорю.
Если человек захочет сделать глупость - он её сделает. Поэтому не занимайтесь борьбой с ветряными мельницами. Если хочется влезть в потроха - это сделают.


А static переменные можно каким-то способом считать?
 
 Top
MiksIr
Отправлено: 26 Апреля, 2015 - 15:24:35
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


MAXUS пишет:
Ну, и вопрос просто логики. Для чего нужны private переменные? В чем их суть?

Вот с этого стоило начинать.
Что бы это понять, нужно полнимать ООП, и в первую очередь - инкапсуляцию.
Можно начать с википедии https://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)


-----
self-banned
 
 Top
MAXUS
Отправлено: 26 Апреля, 2015 - 15:32:25
Post Id


Посетитель


Покинул форум
Сообщений всего: 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.

Я не прав?
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Апреля, 2015 - 15:40:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




MAXUS пишет:
Потому что вопрос ты не понял
Я все прекрасно понял. А Мелкий озвучил это явно.
Если нужно сокрытие кода ядра, только с предоставлением апи -- используй ион-куб и/или зенд-гвард.
 
 Top
MAXUS
Отправлено: 26 Апреля, 2015 - 15:44:00
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




DeepVarvar пишет:
MAXUS пишет:
Потому что вопрос ты не понял
Я все прекрасно понял. А Мелкий озвучил это явно.
Если нужно сокрытие кода ядра, только с предоставлением апи -- используй ион-куб и/или зенд-гвард.


Мне не нужно сокрытие кода. Мне нужно сокрытие данных объекта. Кмк, ты путаешь класс и объект.

(Отредактировано автором: 26 Апреля, 2015 - 15:48:07)

 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Апреля, 2015 - 15:52:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Пххх, эт ты путаешь.
Класс -- это декларация (ну да, есть нюансы для абстрактов и статики), а объект это использование декларации.
 
 Top
MiksIr
Отправлено: 26 Апреля, 2015 - 16:03:30
Post Id


Забанен


Покинул форум
Сообщений всего: 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
 
 Top
MAXUS
Отправлено: 26 Апреля, 2015 - 16:42:57
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




MiksIr пишет:

Читайте уж все ;)
Потом осмыслить неплохо бы.


Да прочитал, в принципеУлыбка Инкапсуляция - механизм, который позволяет объединить внутри объекта данные и связанные с ними функции, закрыв их от прямого внешнего изменения. Private переменные, как составляющая инкапсуляции отвечает непосредственно задаче закрыть возможность прямого доступа извне, но не отвечает задаче скрыть данные, которые а них хранятся, а попросту в большинстве языков они доступны для чтения тем или иным способом.

Поэтому вывод 1. Нефиг хранить в них то, к чему ты хочешь ограничить доступ не только на изменение, но и на чтение. Следует иметь в виду, что объявив внутри класса переменную как private вы не только предоставляете возможность другим функциям класса читать и изменять данные, но и предоставляете к таким данным доступ на чтение извне.

Вывод 2. Вернее предположение. Переменные не будут видны извне:
- только внутри scope функции (традиционно)
- или если они объявлены внутри класса как private static (вот это как раз предположение), я во всяком случае не нашел способа к таким переменным продолбиться. Например,
PHP:
скопировать код в буфер обмена
  1. class a{
  2.         private static $v1;
  3.         private $v2;
  4.         public function set($value){
  5.                 self::$v1=$value;
  6.                 $this->v2=$value;
  7.         }
  8. }
  9. $a=new a();
  10. $a->set('test');
  11. echo '<pre>';
  12. print_r($a);
  13. echo '</pre>';

Если есть способ считать $v1, то подскажите, чтобы я не заблуждалсяУлыбка
(Добавление)
Мелкий пишет:
Ну вы бы ещё про сериализацию вспомнили. Там можно даже менять приватные переменные, не то что читать из значения.
А уж про возможность менять приватные члены в рантайме тупым closure::bindto я даже не говорю.
Если человек захочет сделать глупость - он её сделает. Поэтому не занимайтесь борьбой с ветряными мельницами. Если хочется влезть в потроха - это сделают.


Правильно я понимаю, что при помощи Closure::bind можно и статические переменные считать? Просто у меня php 5.3...
 
 Top
MiksIr
Отправлено: 26 Апреля, 2015 - 20:28:53
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


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

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

Есть, например, питон - неплохой ООП язык, в котором нет встроенных конструкций типа private/protected. И там неплохо обходятся соглашениями в наименованиях функций (подчеркивание перед названием).

Часто язык наоборот предоставляет средства работы с такими "закрытыми" данными, например, в пхп есть рефлексия. Это иногда нужно при написании юнит-тестов, например.

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

(Отредактировано автором: 26 Апреля, 2015 - 20:29:33)



-----
self-banned
 
 Top
Мелкий Супермодератор
Отправлено: 26 Апреля, 2015 - 20:59:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




MAXUS пишет:
Правильно я понимаю, что при помощи Closure::bind можно и статические переменные считать?

Да, можно.
Для 5.3, емнип, runkit даст делать глупости. Скорей всего рефлексия даст делать глупости.

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


-----
PostgreSQL DBA
 
 Top
MAXUS
Отправлено: 27 Апреля, 2015 - 06:27:21
Post Id


Посетитель


Покинул форум
Сообщений всего: 329
Дата рег-ции: Апр. 2011  


Помог: 7 раз(а)




MiksIr пишет:
private - это в первую очередь для удобства разработки, своеобразный синтаксический сахар.

(Добавление)
Мелкий пишет:
В первую очередь это контракт, что вот эти методы и свойства мы будем читать-писать только изнутри этого класса.


Спасибо! Щас все встало на свои места. Перестану донкихотствовать и начну житьУлыбка
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB