Názor k článku PHP okénko: Kontrola chyb od Mordae - Já jsem narazil na několik problémů, s errory...

  • Článek je starý, nové názory již nelze přidávat.
  • 25. 4. 2005 15:48

    Mordae (neregistrovaný)

    Já jsem narazil na několik problémů, s errory si hraju už dost dlouho a tak jsem vymyslel tohle...

    <?php
    /**
     *  Nějaká třída
     */
    class Foo{
      /**
       *  Konstruktor, zvláštní tím, že nevrací hodnotu.
       *  @param string
       */
      function Foo($arg){
        if(!is_scalar($arg)){
          $this = & new Error('...');
          return;
        }
      }
    
      /**
       *  Normální metoda.
       *  @param string
       */
      function doSomething($arg){
        if(!is_scalar($arg)){
          return new Error('...');
        }
      }
    }
    $foo = & new Foo(array('test'));
    if(isError($foo)){
      # Poslat výš, nebo tak něco...
    }
    $res = $foo->doSomething(array('bububu'));
    if(isError($res)){
      # Poslat výš, nebo tak něco...
    }
    ?>

    Tohle je sice funkční, ale sémanticky zatraceně blbá metoda. Předefinovat this je hodno blbce jako já .-). A navíc to nefunguje v PHP/5. Omlouvám se za délku příspěvku, jdu ukázat další, pěknější metodu...

    <?php
    /**
     *  Nějaká třída
     */
    class Foo{
      /**
       *  Konstruktor, zvláštní tím, že nevrací hodnotu.
       *
       *  @param string
       *    Chybová proměnná.
       *  @param string
       */
      function Foo(&$e, $arg){
        if($e) return;
        if(!is_scalar($arg)){
          $e .= __FILE__ . '->Foo(): Expected string, ' . gettype($arg) . ' passed.';
          return;
        }
      }
    
      /**
       *  Normální metoda.
       *  @param string
       *    Chybová proměnná.
       *  @param string
       */
      function doSomething(&$e, $arg){
        if($e) return;
        if(!is_scalar($arg)){
          $e .= __FILE__ . '->doSomething(): Expected string, ' . gettype($arg) . ' passed.';
          return;
        }
      }
    }
    $e = '';
    $foo = & new Foo($e, array('test'));
    $res = $foo->doSomething($e, array('bububu'));
    if($e){
      die($e);
    }
    ?>

    Tahle metoda je poměrně spolehlivá. Má také své mouchy. Dá se poměrně slušně vylepšit stopováním pomocí debug_backtrace(). Co se týče odchytu PHP chyb, doporučuji definovat pomocí php funkce set_error_handler() nastavit vlastní funkci na výpis chyb a ty v ostrém provozu raději logovat, než posílat na klienta.

    Ještě jednou se omlouvám za délku příspěvku. Jo a mimochodem, autor nepíše tak mizerně, rozhodně ne pro úplné začátečníky...

    PS: Rád kdykoliv poradím... stačí napsat; mordae@mordae.net