"PHP" / Говнокод #16635 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
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 = че-нибудь

"Cannot re-assign $this"

А вот как выше можно!

Запостил: doo_dee_doo_dmt doo_dee_doo_dmt, (Updated )

Комментарии (28) RSS

  • > $this = че-нибудь
    А в чем вообще смысл этого действа?
    Ответить
    • Смысла нет, но дело в том, что от прямого присвоения нового значения $this через оператор = пых защищает, а от непрямого (если передадим $this в функцию) защиты нет.
      Ответить
      • потому что уж слишком много идиотов пытаются сделать `$this = че-нибудь`, вот и сделали в php т.н. "защиту от дурака".
        а от таких изощрений уже не защитились.
        Ответить
        • > пытаются сделать `$this = че-нибудь`
          Да и пускай бы делали. Это ж самый обычный аргумент функции.
          Ответить
        • А от таких вот и надо было защищаться. Вот например передаем куда-нибудь в метод стороннего класса (написанный х.з кем) $this, а потом ни очем не подозревая возвращаем return $this; и к херям флюент интерфейс...
          Ответить
          • Да какая в жопу разница $this тебе испортили или какую-то еще переменную? Логика то точно так же порушится.

            Вот именно поэтому в жабе, питоне и прочих языках вообще не стали мутить передачу по ссылке.
            Ответить
            • А если соблюдать правила приличия, и юзать передачу по ссылке только там, где она действительно нужна (т.е. в реалиях пыхи - почти нигде), то всё будет норм. Нечего тут паранойю разводить.
              Ответить
              • >юзать передачу по ссылке только там, где она действительно нужна (т.е. в реалиях пыхи - почти нигде),

                То есть хеши копировать?
                Ответить
            • Иногда передача по ссылке в пыхе полезна... В заголовке цикла например: http://ideone.com/V7URon

              Безопасным было бы запретить конструкцию foreach($array as &$value) и вместо неё писать: foreach($array as $key=>$value), но тогда вместо короткого $value в левой части выражений придётся всюду писать $array[$key] (что было бы понятнее, но программистам это делать лень).
              Ответить
              • Ну это же не передача в соседнюю функцию по ссылке, а просто специальный синтаксис.

                А почему value не сделали ссылкой по умолчанию?
                Ответить
                • > А почему value не сделали ссылкой по умолчанию?
                  Видимо, как раз из-за интересных последствий, которые показаны в том примере на ideone - скопов то нет, и $value = 'foo' после цикла поместит 'foo' в последний просмотренный циклом элемент массива...
                  Ответить
                  • Причём если ключи не числовые, а строковые, а над массивом проводились обряды добавления и удаления элементов, то даже Ванга не сообразит, какой из элементов окажется последним просмотренным.
                    Ответить
                      • Причём тогда последний просмотренный может оказаться первым найденным по условию, над которым действительно нужно совершить какие-нибудь действия, а внутри тела цикла их по ряду религиозных причин делать не хочется.

                        Казалось бы, это тот самый случай, где ссылка и использование счётчика вне цикла оправданы... но всё равно говно, потому что можно сделать по-другому.
                        Ответить
                • Вероятно, чтобы уменьшить частоту прострелов ноги (см. в примере присвоение после выхода из цикла), т. к. $value почему-то не является локальным объектом для цикла, а действует и после выхода, поэтому официальная™ документация даже предлагает делать unset($value), чтобы случайно что-нибудь не запороть.

                  P.S. Ну почему я не обновил страницу перед отправкой комментария?
                  Ответить
              • >Иногда передача по ссылке в пыхе полезна...
                Ссылка может нас менять,
                Ты другой, и я не та.
                Значит нужно все начать
                С нового инта.Какие -то ебанаты решили послушать глубокой ночью музончик на максимальной громкости. Хорошо что я еще спать не ложился.
                Ответить

Добавить комментарий

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8