Помощник
|
Очень интересаная задача для Guru PHP! |
ZhukV
|
Сообщение
#1
|
||
|
|
||
|
|||
Arks |
12.12.2012, 22:59;
Ответить: Arks
Сообщение
#2
|
|
судя по описанию это должна быть невероятно интересная задача. Вот и занимайтесь. По мне - это не интересная задача а бред: "имея private свойства давайте что-то там ломанем чтобы они стали не private". Гениально вообще.
|
|
|
Great-Antique |
13.12.2012, 1:02;
Ответить: Great-Antique
Сообщение
#3
|
|
1-ая задача. вполне себе решаемая задача
http://php.net/manual/ru/reflectionclass.getproperties.php 2-ая задача. тут несколько вариантов: 1) если это наш код - убираем защищенность свойств 2) если это не наш код - кто даст нам возможность работать с объектом? |
|
|
ZhukV
|
Сообщение
#4
|
|
Arks, а Вам слабо??? Вы же всех называете "лохами", "нубами", и т.д. А себя считаете гуру, так как вместо того, чтобы дать норм. ответ, Вы тыкаете в людей!
Вот и посиди "быдло" модератор и подумай, как решить эту задачу, вместо того, чтобы говорить там о разных инетрпритациях, компиляциюх (аж сам плутаюсь =((( ) В результате Вашего ответа, могу ответить Вам только одно: 1. Вы только ставите из себя крутого перца! 2. Вы даже толком и не знаете ПХП, а уже из себя строите черт знает что: http://www.html.by/threads/28008-Pamjat-ne...klassy?p=160587 3. А если короче, то Вы "ЛОХ", который нихрена сделать не может, и тыкает в людей что они "ЛОХИ"! |
|
|
ZhukV
|
Сообщение
#5
|
|
Great-Antique, В данном случае Вы все равно не получите доступ к протектед переменным, тем более к приватным!
|
|
|
ZhukV
|
Сообщение
#6
|
|
Задача вполне решаемая!!!
"имея private свойства давайте что-то там ломанем чтобы они стали не private". Гениально вообще. Я дам ответ, но если Вы пректратите свои действия обзывания "нубом" других соучастником сообщества HTML.BY, и посчитсете себя полным НУБОМ, который ставит из себя "ГУРУ" и даже не знает как решить эту задачу! Arks, Именно от Вас жду ответа, так как Вы грозитесь там разными всякими интерпритациями, компиляуиями и т.д. Решите же Вы наконец простую задачу, НУБ!!!! |
|
|
Galen |
13.12.2012, 3:36;
Ответить: Galen
Сообщение
#7
|
|
Таки вы ждёте Аркса, но...
1. Зачем ломать основы ООП? Даже если они ломаемы, в чём лично я сильно сомневаюсь. Если вы обойдёте правила доступа к приватным свойствам, то ломанёте не "одну крутую систему". 2. В теме, которой вы тыкали Арксу в лицо, он ответил абсолютно правильно - может грубо, но он не подписывался быть со всеми вежливым. Человек был абсолютно неправ, но не видел своей ошибки, Аркс сказал "не упрямьтесь" и дальше пояснил почему не стоит упрямиться. Кстати, хотелось бы увидеть решение (у меня есть теоретический вариант, но он не совсем подходит под ваши условия или я их неправильно понял). |
|
|
Witu |
13.12.2012, 7:27;
Ответить: Witu
Сообщение
#8
|
|
ZhukV, на данном примере не интересная и решается криво за 5 минут
[php] $exported = var_export($o, true); $len = strlen(get_class($o)) + 14; $exported = substr($exported, $len); $exported = substr($exported, 0, -1); eval("\$vars = " . $exported . ";"); foreach($vars as $k => $v) { $GLOBALS[$k] = $v; } // Здесь, я должен получить значение приват переменных в объекте $o print $a; print $b; print $c; [/php] если нужно получить значения определенных переменных то нужно ReflectionClass привязать А да... Arks если не можеш ответить на вопрос не пиши ничего ) в каждой теме только и видно что вы ламеры и тд и тп правда я не понял нафига это нужно :) |
|
|
Arks |
13.12.2012, 9:30;
Ответить: Arks
Сообщение
#9
|
|
поведение всяких var_dump'ов, var_export'ов и Reflection в отношении private-свойств менялось от версии к версии. Изменить значения private свойств "извне" все равно нельзя.
Если вы обойдёте правила доступа к приватным свойствам, то ломанёте не "одну крутую систему". Да вообще я бы сказал целую парадигму программирования :) Так что ZhukV, считайте меня кем угодно, пишите там свой ответ, повеселите других. Но тот бред который Вы написали для меня так и останется бредом, странно что Вы это не воспринимаете. Имея доступ к php на сервере совсем не обязательно заниматься всякими извращениями чтобы получить интересующие данные. Инкапсуляция(все эти private, protected свойства) это не защита веб-сервисов "от взлома", и не защита кода от нерадивого программера чтобы чушь не писал. Это защита обрабатываемых программой данных от потенциального случайного изменения внешними данными. |
|
|
ZhukV
|
Сообщение
#10
|
|
HTMLandPHP, как вариант, но в свой черед Вы узнаете только название и значение, но не сможете манипулировать значениями.
1. Зачем ломать основы ООП? Даже если они ломаемы, в чём лично я сильно сомневаюсь. Если вы обойдёте правила доступа к приватным свойствам, то ломанёте не "одну крутую систему". Ломать и не нужно! Простой пример работа ORM Doctrine 1.*, 2.* Идея достаточно простая: В аннотациаях к переменным пишем только названия полей. Функции обработки могут быть любыми, в результате, для сохранения данных в БД или же изьятия их с БД нужно получить к ним доступ, не важно на какой области видимости они расположены! Элементарный класс Entity [PHP] class MyEntity { /** * @ORM\Column(name="column1", type="string", length=255) */ private $myColumn1; /** * @ORM\Column(name="column2", type="ineger") */ private $myColumn2; } [/PHP] Логика система достаточно простая: записать данные в переменные и извлечь отуда, не смотря ни на что! В результате вот и решения проблемы. Решение задачи №1 [PHP] /** * Default class for set values to privat property */ class DefaultClass { // Property 1 protected $property1 = NULL; // Property 2 private $property2 = NULL; /** * Get property 1 */ public function getProperty1() { return $this->property1; } /** * Get property 2 */ public function getProperty2() { return $this->property2; } } // Create a new ReflectionClass for control default sets $refClass = new ReflectionClass('DefaultClass'); // Create a new object for set values to this object $newObject = new DefaultClass(); // Get a property 1 for set value $refProperty1 = new ReflectionProperty($newObject, 'property1'); // Get a property 2 for set value $refProperty2 = new ReflectionProperty($newObject, 'property2'); // Set accessible for set value // (If now use this method, you have fatal error: Access to protected or pivate) $refProperty1->setAccessible(TRUE); $refProperty2->setAccessible(TRUE); // Set value $refProperty1->setValue($newObject, 'Arks - NOOB (Set string value)'); $value2 = new ArrayObject(array('key1' => 'value1', 'key2' => 'value2')); $refProperty2->setValue($newObject, $value2); // Debug print 'Property1: <pre>' . print_r($newObject->getProperty1(), 1) . '</pre>'; print 'Property2: <pre>' . print_r($newObject->getProperty2(), 1) . '<pre>'; print 'Debug full object: <pre>' . print_r($newObject, 1) . '</pre>'; // And a set value (Fatal error) $newObject->property1 = TRUE; [/PHP] Решение задачи №2 [PHP] /** * Default class for getting values */ class DefaultClass { // Property 1 protected $property1 = NULL; // Property 2 private $property2 = NULL; /** * Set property 1 */ public function setProperty1($value) { $this->property1 = $value; } /** * Set property 2 */ public function setProperty2($value) { $this->property2 = $value; } } // Create a new object $newObject = new DefaultClass(); // Set a string value to property 1 $newObject->setProperty1('Arks - NOOB (String value)'); // Set a object value to property 2 $newObject->setProperty2( new ArrayObject(array('key1' => 'value1', 'key2' => 'value2')) ); // Create a new reflection for getting values $refObject = new ReflectionObject($newObject); // Get a properties $refProperty1 = $refObject->getProperty('property1'); $refProperty2 = $refObject->getProperty('property2'); // Set accessible for set value // (If now use this method, you have fatal error: Access to protected or pivate) $refProperty1->setAccessible(TRUE); $refProperty2->setAccessible(TRUE); // Get values print 'Property1: <pre>' . print_r($refProperty1->getValue($newObject), 1) . '</pre>'; print 'Property2: <pre>' . print_r($refProperty2->getValue($newObject), 1) . '</pre>'; // Add a new key to storage $refProperty2->getValue($newObject)->offsetSet('key3', 'value3'); print 'Full object debug: <pre>' . print_r($newObject, 1) . '</pre>'; [/PHP] В первом примере использоваля ReflectionClass как управляющее ядро, но тогда при внедрении значения в переменну нужно объязательно указывать на объект. Во втором примере, управляющее ядро - ReflectionObject. Здесь уже не нужно указывать на объект, так как он уже есть в управляющем ядре. В примере №2 очень четко видно, что даже можно достать объект и внедрить в него любое значение, тоесть полный доступ! --------------------------------- на практике я очень мало видел, где применяются эти методы, но все же, иногда они бываю очень полезными! Самый большой пример применения - Doctrine (https://github.com/doctrine/doctrine2) поведение всяких var_dump'ов, var_export'ов и Reflection в отношении private-свойств менялось от версии к версии Ети методы уже не меняются с момента внедрения Reflection* в ПХП, так что беспокоиться не о чем! Тем более что уже не один компонент и не один сайт работает под приминением такого подхода Изменить значения private свойств "извне" все равно нельзя. Еще одно подтверждения того, что Вы умете только трепать языком и называть всех нубами, в результате могу сказать, что нуб - ВЫ! P.S. Это все можно сделать также подключив Runkit, но как видно из примеров, сильного труда и не надо! Все те кто думали что это невозможно - Вы ошибались, Reflection умеет и только такое делать! Все те кто четко говорили, что это невозможно, и программируете уже более 2 лет - можете спокойно обозвать себя полным нубом, в том числе и Arks ))) Могу то показать еще множество приколов, в том числе как можно вызывать protected methods (точно по такому же принцыпу!) |
|
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
Партнерская программа для Эзотерики, Магии, Таро партнерка для эзотерики |
0 | LiveExpert | 374 | Вчера, 15:13 автор: LiveExpert |
|
Партнерская программа для Эзотерики, Магии, Таро партнерка для эзотерики |
0 | LiveExpert | 343 | Вчера, 15:13 автор: LiveExpert |
|
Azinomoney.com - гемблинг-партнерка с 65%RS для каждого Гарантированный заработок на гемблинг-трафике |
65 | AzinoMoney | 29197 | 27.3.2024, 19:10 автор: AzinoMoney |
|
Делаю полностью уникальный дизайн для сайтов! | 46 | AlexDIZ | 93513 | 26.3.2024, 20:03 автор: AlexDIZ |
|
Большие ставки для кликов в Я.Директ. Как удешевить? | 2 | rownong27 | 1124 | 26.3.2024, 14:13 автор: knezevolk |
Текстовая версия | Сейчас: 29.3.2024, 12:18 |