X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Очень интересаная задача для Guru PHP!
ZhukV
ZhukV
Topic Starter сообщение 12.12.2012, 22:30; Ответить: ZhukV
Сообщение #1


Доброго времени суток всем!

Есть очень интересная задача для всех пользователей этого форума!

Задача:
Есть класс, в котором есть proceted и privat свойства.
Зная только названия класса и переменную, которая хранит объект этого класса нужно достать все название privat свойств с ихними значениями.

Пример:

[PHP]
class AA{
protected $a = NULL;
private $b = NULL;
private $c = NULL;

public function setA($a){ $this->a = $a; }
public function setB($b){ $this->b = $b; }
public function setC($c){ $this->c = $c; }
}


$o = new AA;
$o->setA('protected property');
$o->setB('AXAXAXAXAXA');
$o->setC('((( WHY????');

// Здесь, я должен получить значение приват переменных в объекте $o
print $a;
print $b;
print $c;
[/PHP]


Задача №2

Поностью обратная задача:
Имея протекдет и приват свойста установить их значения:

[PHP]
class AA{
protected $a = NULL;
private $b = NULL;
private $c = NULL;

public function getA($a){ $this->a = $a; }
public function getB($b){ $this->b = $b; }
public function getC($c){ $this->c = $c; }
}

$o = new AA;

// Здесь устанавливаем

print $o->getA();
print $o->getB();
print $o->getC();
[/PHP]


Если иметь в руках такой код, можно ломануть одну крутую систему! Очень проше всех взять участвие!

P.S.
Лично прошу взять участь в можератора - Arks, который только умеет трепать языком и говорить, что если человек дает вопрос, то он нуб!

P.SS
Толком сам не знаю, решается ли эта задача, так как свойства не паблик ((
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
сообщение 12.12.2012, 22:59; Ответить: Arks
Сообщение #2


судя по описанию это должна быть невероятно интересная задача. Вот и занимайтесь. По мне - это не интересная задача а бред: "имея private свойства давайте что-то там ломанем чтобы они стали не private". Гениально вообще.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Great-Antique
Great-Antique
сообщение 13.12.2012, 1:02; Ответить: Great-Antique
Сообщение #3


1-ая задача. вполне себе решаемая задача
http://php.net/manual/ru/reflectionclass.getproperties.php

2-ая задача. тут несколько вариантов:
1) если это наш код - убираем защищенность свойств
2) если это не наш код - кто даст нам возможность работать с объектом?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZhukV
ZhukV
Topic Starter сообщение 13.12.2012, 2:41; Ответить: ZhukV
Сообщение #4


Arks, а Вам слабо??? Вы же всех называете "лохами", "нубами", и т.д. А себя считаете гуру, так как вместо того, чтобы дать норм. ответ, Вы тыкаете в людей!
Вот и посиди "быдло" модератор и подумай, как решить эту задачу, вместо того, чтобы говорить там о разных инетрпритациях, компиляциюх (аж сам плутаюсь =((( )

В результате Вашего ответа, могу ответить Вам только одно:
1. Вы только ставите из себя крутого перца!
2. Вы даже толком и не знаете ПХП, а уже из себя строите черт знает что: http://www.html.by/threads/28008-Pamjat-ne...klassy?p=160587
3. А если короче, то Вы "ЛОХ", который нихрена сделать не может, и тыкает в людей что они "ЛОХИ"!
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZhukV
ZhukV
Topic Starter сообщение 13.12.2012, 2:42; Ответить: ZhukV
Сообщение #5


Great-Antique, В данном случае Вы все равно не получите доступ к протектед переменным, тем более к приватным!
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZhukV
ZhukV
Topic Starter сообщение 13.12.2012, 2:48; Ответить: ZhukV
Сообщение #6


Задача вполне решаемая!!!

(Arks @ 13.12.2012, 01:59) *
"имея private свойства давайте что-то там ломанем чтобы они стали не private". Гениально вообще.


Я дам ответ, но если Вы пректратите свои действия обзывания "нубом" других соучастником сообщества HTML.BY, и посчитсете себя полным НУБОМ, который ставит из себя "ГУРУ" и даже не знает как решить эту задачу!

Arks, Именно от Вас жду ответа, так как Вы грозитесь там разными всякими интерпритациями, компиляуиями и т.д. Решите же Вы наконец простую задачу, НУБ!!!!
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Galen
Galen
сообщение 13.12.2012, 3:36; Ответить: Galen
Сообщение #7


Таки вы ждёте Аркса, но...

1. Зачем ломать основы ООП? Даже если они ломаемы, в чём лично я сильно сомневаюсь. Если вы обойдёте правила доступа к приватным свойствам, то ломанёте не "одну крутую систему".
2. В теме, которой вы тыкали Арксу в лицо, он ответил абсолютно правильно - может грубо, но он не подписывался быть со всеми вежливым. Человек был абсолютно неправ, но не видел своей ошибки, Аркс сказал "не упрямьтесь" и дальше пояснил почему не стоит упрямиться.

Кстати, хотелось бы увидеть решение (у меня есть теоретический вариант, но он не совсем подходит под ваши условия или я их неправильно понял).
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Witu
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
Arks
сообщение 13.12.2012, 9:30; Ответить: Arks
Сообщение #9


поведение всяких var_dump'ов, var_export'ов и Reflection в отношении private-свойств менялось от версии к версии. Изменить значения private свойств "извне" все равно нельзя.
Если вы обойдёте правила доступа к приватным свойствам, то ломанёте не "одну крутую систему".
Да вообще я бы сказал целую парадигму программирования :)
Так что ZhukV, считайте меня кем угодно, пишите там свой ответ, повеселите других. Но тот бред который Вы написали для меня так и останется бредом, странно что Вы это не воспринимаете. Имея доступ к php на сервере совсем не обязательно заниматься всякими извращениями чтобы получить интересующие данные. Инкапсуляция(все эти private, protected свойства) это не защита веб-сервисов "от взлома", и не защита кода от нерадивого программера чтобы чушь не писал. Это защита обрабатываемых программой данных от потенциального случайного изменения внешними данными.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZhukV
ZhukV
Topic Starter сообщение 13.12.2012, 16:51; Ответить: ZhukV
Сообщение #10


HTMLandPHP, как вариант, но в свой черед Вы узнаете только название и значение, но не сможете манипулировать значениями.



(Galen @ 13.12.2012, 06:36) *
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)


(Arks @ 13.12.2012, 12:30) *
поведение всяких var_dump'ов, var_export'ов и Reflection в отношении private-свойств менялось от версии к версии

Ети методы уже не меняются с момента внедрения Reflection* в ПХП, так что беспокоиться не о чем! Тем более что уже не один компонент и не один сайт работает под приминением такого подхода

(Arks @ 13.12.2012, 12:30) *
Изменить значения private свойств "извне" все равно нельзя.

Еще одно подтверждения того, что Вы умете только трепать языком и называть всех нубами, в результате могу сказать, что нуб - ВЫ!

P.S.
Это все можно сделать также подключив Runkit, но как видно из примеров, сильного труда и не надо!
Все те кто думали что это невозможно - Вы ошибались, Reflection умеет и только такое делать!
Все те кто четко говорили, что это невозможно, и программируете уже более 2 лет - можете спокойно обозвать себя полным нубом, в том числе и Arks )))
Могу то показать еще множество приколов, в том числе как можно вызывать protected methods (точно по такому же принцыпу!)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Партнерская программа для Эзотерики, Магии, Таро
партнерка для эзотерики
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


 



RSS Текстовая версия Сейчас: 29.3.2024, 12:18
Дизайн