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

    +2

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    // Статическая типизация для PHP < 7.0
    
    set_error_handler(function(){});
    
    function foo(int $bar)
    {
    	var_dump($bar);
    }
    
    foo(1); // Работает и выводит int(1)

    Недавно разгребал легасикод доставшийся по наследству. Увидел статическую типизацию там где ее не должно было быть. Проект крутится на 5.3.

    Запостил: KiTE, 16 Марта 2016

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

    • Этот код будет работать и с вызовом foo('Hello, world!');
      Обработку ошибок ведь подавили.

      А статической типизации в PHP нет. Есть так называемый хинт типа, который генерирует исключение, если тип не совпадает с ожидаемым. Но если исключение поймать, то в $bar можно протащить значение любого типа.
      Ответить
      • Естественно никакого скалярного тайп-хинтинга в php5 нет и быть не может.
        Я не расставил смайлы. Это был сарказм )
        Ответить
      • > Но если исключение поймать
        Но ты же его поймаешь в вызывающей функции... Т.е. цель в общем-то достигнута - функцию с кривым параметром не позвали.

        З.Ы. Или set_error_handler тупо поедает все исключения прямо в момент их рождения?
        Ответить
        • It is important to remember that the standard PHP error handler is completely bypassed for the error types specified by error_types unless the callback function returns FALSE.

          Если обработчик, назначенный с помощью set_error_handler, явно не вернул FALSE и принудительно не убил программу, то управление молча возвращается обратно. Как в Бейсике, когда ON ERROR RESUME NEXT.

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

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