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

    +149

    1. 1
    2. 2
    $ev = '$atHtml[] = template::translateTemplate('.$atArr[0].'::getHTML($atArr[1]));';
    eval($ev);

    Самый простой способ заставить работать статический метод класса из переменной в PHP ниже 5.3.

    Запостил: Lander, 20 Марта 2013

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

    • нахуй оно надо?
      Ответить
      • $atHtml[] = template::translateTemplate($atArr[0]::getHTML($atArr[1]));
        До версии 5.3 выдаёт ошибку. в $atArr[0] содержится имя подключаемого класса.
        Ответить
        • аааа, ну это типа динамически и всё такое... Но с виду как кусок говна.
          Ответить
          • Так тут ему самое место, поэтому и запостил :)
            Ответить
    • >Самый простой способ

      Это сарказм или вы действительно не знаете про
      call_user_func($atArr[0] . '::getHTML', $atArr[1]);
      Ответить
      • Тоже неидеально, но лучше, чем оригинал.
        Ответить
        • Что значит "неидельно"? Это стандартный способ делать подобные вещи. Для портируемости на ранние версии PHP можно написать
          call_user_func(array($atArr[0], 'getHTML'), $atArr[1]);
          но это ничего принципиально не меняет.
          Ответить
          • Это неидеально, так как из вашего кода с call_user_func совсем не следует, что вызывается статический метод. Он совершенно неочевиден.

            Сравните в Python:
            a.__class__.f(10)
            Ответить
            • Но в PHP нет другого нормального способа.
              Ответить
            • Да, без __этого__ питон утратит всю очевидность
              Ответить
              • Питон - единственный язык, содержащий очевидные хаки. Все остальные языки или не содержат хаков, или их хаки не очевидны.
                Ответить
    • говно даже не в eval, а в том, что, видимо, эта хрень сидит внутри цикла, да и сама идея $atArr - говно.
      Ответить
    • file_put_contents('tmp.inc', '$atHtml[] = template::translateTemplate('.$atArr[0].'::getHTML($atArr[1]));')
      require 'tmp.inc';

      НЕ БЛАГОДАРИ
      Ответить
    • vanished
      Ответить

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