Как стать автором
Обновить

Комментарии 21

Все-таки нехорошо так делать, принцип инкапсуляции не зря придумали
Иногда бывает нужно, например если необходимо сериализовать\десериализовать объект. Тут уж либо вручную писать, либо автоматизировать. Рефлекнш очень уж медленный — можно использовать лишь там, где производительность сильно не пострадает, но когда мне нужно было граф из 150-300 объектов превращать в xml, использовать, к примеру dom+reflection было очень накладно.

Но в целом через какое-то время все свелось к кодогенерации: на проперти something в доки добавляем @Seriazable something, ну или просто @Serializable, если не нужно название менять в сериализованном виде, или на методы (потому что иногда состояние объекта необходимо вычислять, как например количество предков) @Serialize length / @Deserialize length

И после по этим классам проходились тулзой которая генерила мапперы умеющие сериализовать и десериализовать, в которой например в методе serialize было что-то вроде $this->out->write(«something», $instance->getSomething());
если нужно граф из 150-300 объектов превращать в xml, у вас явно что-то не то с архитектурой.
Вы только из одного комментария смогли понять что у меня было за приложение и что там было, «что-то не то с архитектурой».

Не пробовали поучаствовать в битве экстрасенсов?
а если 15-20? а если не xml, а yaml? а если не граф, а просто массив объектов?
имхо, невозможно сказать что что-то является нормальным/ненормальным в отрыве от контекста. иногда самые безумные решения являются самыми оптимальными, если не единственно возможными.
Я думаю, если я скажу, что иногда приходилось и не одну тысячу объектов упаковывать (и распаковывать для редактирования тоже) в хитрое бинарное представление, делая при этом некоторые модификации (самое простое — инкремент поля version при модификации) и общаться при этом через сокеты с _несколькими_ приложениями, и возможностью откатить результат, если один из наших клиентов не смог вернуть нормальный ответ (правда это было реализовано только частично) — то его наверное хватит удар, а я буду еретиком.
Конечно. Но случаи бывают разные.
Автор, при чем тут «отражение»? Reflection — это название класса и оно не переводится.
Думаю, что автор переводил термин рефлексия, а не название конкретного класса.
И судя по всему, перевод корректен.
Взял в кавычки %)
Думаю, это излишне: термин стандартный, и применен в привычном для него контексте.
А чем оно всё-таки лучше Reflection?
Автор, а вы не проводили тесты производительности по сравнению с обычным подходом через рефлексию?
http://pastebin.com/dnVjbcu1

Если тесты я сделал правильно, ты выигрыш по времени больше чем в два раза.
Для большей показательности я бы еще добавил скорость ручного обхода через методы-ацессоры.
>Например, для того, чтобы написать свою сериализацию.
А чем стандартная не подходит? Мне приходит очень мало задач в голову, где может понадобиться кастомная сериализация и все они почему то из области общения между разными платформами, но тут как правило все решается общением через SOAP.
Стандартная может не подходить, например, из-за того, что нужно к существующему решению с блекджеком сокетами и дамами легкого поведения бинарными данными, прикрутить систему администрирования. Ну не умеет один прекрасный сервер написанный, допустим на C++, общаться через http. А с ним надо общаться. И быстро.
Да хотя бы и SOAP. Написав несложный класс можно будет практически любой объект конвертировать в XML.

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

<?php
class aClass
{
    protected $protected_property = 'protected_value';
    private $private_property = 'private_value';
    public $public_property = 'public_value';
	
	public function showSelf() {
		echo $this->private_property,PHP_EOL,
			$this->protected_property,PHP_EOL,
			$this->public_property,PHP_EOL;
	}
}

$an_object = new aClass;

$an_array["\0aClass\0private_property"] = 'new_private_value';
$an_array["\0*\0protected_property"] = 'new_protected_value';
$an_array["public_property"] = 'new_public_value';
array_walk($an_object, function(&$val, $key, $array){ $val = $array[$key]; }, $an_array);

$an_object->showSelf();
/* Output:
new_private_value
new_protected_value
new_public_value
*/


P.S.: Всё же каждый инструмент должен быть использован по назначению.
«Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете» (с) С. Макконнелл
Интересный баг, а может все таки фича?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории