Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
class TestThis
{
public $property = 'property';
public function test1()
{
$this->this($this, new ArrayObject);
$this['wierd'] = true;
print_r($this);
print_r($this->property . PHP_EOL);
return $this;
}
public function test2()
{
print_r($this);
}
public function this(&$object, $value)
{
$object = $value;
}
}
(new TestThis)->test1()->test2();
Смысла нет, но дело в том, что от прямого присвоения нового значения $this через оператор = пых защищает, а от непрямого (если передадим $this в функцию) защиты нет.
потому что уж слишком много идиотов пытаются сделать `$this = че-нибудь`, вот и сделали в php т.н. "защиту от дурака".
а от таких изощрений уже не защитились.
А от таких вот и надо было защищаться. Вот например передаем куда-нибудь в метод стороннего класса (написанный х.з кем) $this, а потом ни очем не подозревая возвращаем return $this; и к херям флюент интерфейс...
А если соблюдать правила приличия, и юзать передачу по ссылке только там, где она действительно нужна (т.е. в реалиях пыхи - почти нигде), то всё будет норм. Нечего тут паранойю разводить.
Иногда передача по ссылке в пыхе полезна... В заголовке цикла например: http://ideone.com/V7URon
Безопасным было бы запретить конструкцию foreach($array as &$value) и вместо неё писать: foreach($array as $key=>$value), но тогда вместо короткого $value в левой части выражений придётся всюду писать $array[$key] (что было бы понятнее, но программистам это делать лень).
> А почему value не сделали ссылкой по умолчанию?
Видимо, как раз из-за интересных последствий, которые показаны в том примере на ideone - скопов то нет, и $value = 'foo' после цикла поместит 'foo' в последний просмотренный циклом элемент массива...
Причём если ключи не числовые, а строковые, а над массивом проводились обряды добавления и удаления элементов, то даже Ванга не сообразит, какой из элементов окажется последним просмотренным.
Причём тогда последний просмотренный может оказаться первым найденным по условию, над которым действительно нужно совершить какие-нибудь действия, а внутри тела цикла их по ряду религиозных причин делать не хочется.
Казалось бы, это тот самый случай, где ссылка и использование счётчика вне цикла оправданы... но всё равно говно, потому что можно сделать по-другому.
Вероятно, чтобы уменьшить частоту прострелов ноги (см. в примере присвоение после выхода из цикла), т. к. $value почему-то не является локальным объектом для цикла, а действует и после выхода, поэтому официальная™ документация даже предлагает делать unset($value), чтобы случайно что-нибудь не запороть.
P.S. Ну почему я не обновил страницу перед отправкой комментария?
>Иногда передача по ссылке в пыхе полезна...
Ссылка может нас менять,
Ты другой, и я не та.
Значит нужно все начать
С нового инта.Какие -то ебанаты решили послушать глубокой ночью музончик на максимальной громкости. Хорошо что я еще спать не ложился.
А в чем вообще смысл этого действа?
а от таких изощрений уже не защитились.
Да и пускай бы делали. Это ж самый обычный аргумент функции.
Вот именно поэтому в жабе, питоне и прочих языках вообще не стали мутить передачу по ссылке.
То есть хеши копировать?
Тут просто или трусы снять или крест надеть уж
Безопасным было бы запретить конструкцию foreach($array as &$value) и вместо неё писать: foreach($array as $key=>$value), но тогда вместо короткого $value в левой части выражений придётся всюду писать $array[$key] (что было бы понятнее, но программистам это делать лень).
А почему value не сделали ссылкой по умолчанию?
Видимо, как раз из-за интересных последствий, которые показаны в том примере на ideone - скопов то нет, и $value = 'foo' после цикла поместит 'foo' в последний просмотренный циклом элемент массива...
Казалось бы, это тот самый случай, где ссылка и использование счётчика вне цикла оправданы... но всё равно говно, потому что можно сделать по-другому.
P.S. Ну почему я не обновил страницу перед отправкой комментария?
Потому что нормальных скопов нет 🙂
Ссылка может нас менять,
Ты другой, и я не та.
Значит нужно все начать
С нового инта.Какие -то ебанаты решили послушать глубокой ночью музончик на максимальной громкости. Хорошо что я еще спать не ложился.
ты тоже из сибирских руд нам тут пишешь?