1. PHP / Говнокод #16635

    +158

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 02 Сентября 2014

    Комментарии (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' в последний просмотренный циклом элемент массива...
                    Ответить
                    • Причём если ключи не числовые, а строковые, а над массивом проводились обряды добавления и удаления элементов, то даже Ванга не сообразит, какой из элементов окажется последним просмотренным.
                      Ответить
                      • А еще ведь есть break...
                        Ответить
                        • Причём тогда последний просмотренный может оказаться первым найденным по условию, над которым действительно нужно совершить какие-нибудь действия, а внутри тела цикла их по ряду религиозных причин делать не хочется.

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

                    P.S. Ну почему я не обновил страницу перед отправкой комментария?
                    Ответить
                    • > почему-то
                      Потому что нормальных скопов нет :)
                      Ответить
                  • Stay inrvtmafioe, San Diego, yeah boy!
                    Ответить
                  • Son of a gun, this is so helulpf! http://wrzsbn.com [url=http://smdhgt.com]smdhgt[/url] [link=http://twpwql.com]twpwql[/link]
                    Ответить
                • >Иногда передача по ссылке в пыхе полезна...
                  Ссылка может нас менять,
                  Ты другой, и я не та.
                  Значит нужно все начать
                  С нового инта.Какие -то ебанаты решили послушать глубокой ночью музончик на максимальной громкости. Хорошо что я еще спать не ложился.
                  Ответить
        • Какой багор )))
          Ответить
    • Можно ещё так:
      $that =& $this;
      $that = new ArrayObject;
      Ответить

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