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

    +57

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    function SetImage($row=array())
    	{
         foreach($row as $property=>$value)
         	{
         	eval("\$this->".$property." = '".$value."';");
         	}
    	}

    Запостил: minramilka, 30 Августа 2012

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

    • SetImage(array("foo='bar'; system('rm -rf *'); \$this->foo" => "bar"))
      Ответить
    • Вопрос к знатокам PHP - есть ли более красивое решение данной задачи?
      function SetImage($row=array())
      {
          foreach($row as $property=>$value)
          {
              $this->$property = $value;
          }
      }
      Ответить
      • А чего тебе еще надо? Достаточно красиво. В жабе даже с рефлексией/интроспекцией так кратко не получится.
        Там пишут целые фреймворки чтобы решить эту задачу.
        Ответить
        • Потому что Джава статическая, а PHP - динамический.

          А так, ну вот в Питоне например можно сделать так:
          self.__dict__.update(row)

          Но лучше так НЕ делать :)
          Ответить
      • можно через Reflection но зачем ? Короче не получится. читабельней тоже. Единственное стоит проверить если такое свойство.
        Ответить
      • Думается, можно один раз написать merge для объекта с массивом и реюзать его в таких ситуациях. Для нормального merge желательно ещё иметь возможность указать фильтр и прочие полезняшки.
        Ответить
      • Это в принципе плохое решение, поскольку содержимое $row неизвестно. Не знаем ни какие ключи там, ни тип данных.
        Правильным решением было бы

        function SetImage($row=array())
        {
        $this->propertyArray = $row;
        }

        То есть по сути сделать обычный сеттер.
        Либо использовать делать $row объектом и передавать типизированный параметр в SetImage
        Ответить
        • Ну это не совсем то, что хотел автор исходного кода. Так я и на любом статически типизированном языке сделаю.

          Допустим, что автор пишет нечто вроде ORM'а, и ему нужно сгенерить объект с указанным набором полей. Для такой задачи мой код вменяем?

          P.S. Допустим, что тип $row описан в комментарии\документации к методу, поэтому мы знаем какие там ключи и типы значений.
          Ответить
          • Коммент выше был мой.
            В принципе, конечно можно делать и так, как было, php это позволяет, но на мой взгляд это нехорошая практика создавать объекту свойства динамически. То есть я клоню к тому, что $row может содержать ключи, которые не будут соответствовать описанным свойствам.
            Лично я бы не стал так делать: $this->$property = $value;
            Если это ORM - лучше написать через __set().
            А то, что кем-то описано "на полях" о входных данных, не является на мой взгляд достаточным аргументом, чтобы забивать на проверки в коде.
            Ответить

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