Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2014
    residenza
    Voltati
    Messaggi
    913

    trigger_error() nascondere nome file e linea

    Sto scrivendo una classe in cui ho bisogno di alcune proprietà modificabili "da dentro" ma "da fuori" soltanto visibili. Ho provato ad usare il metodo __get. Per conservare il notice ho provato così:


    Codice PHP:
    public function __get ($property) {
        private 
    $prop1;
        private 
    $prop2;
        private 
    $prop3;
       switch (
    $property) {
            case 
    "prop1": return $this->prop1;
            case 
    "prop2": return $this->prop2;
            case 
    "prop3": return $this->prop3;
            default:
                
    $backtrace debug_backtrace()[0];
                
    trigger_error("Undefined property: OOString::\$" $property " in <b>" $backtrace["file"] . "</b> on line <b>" $backtrace["line"] . "</b><br/>"E_USER_NOTICE); // linea 87
        
    }


    funziona tutto bene, solo che nel notice mi segna anche la riga in cui c'è la funzione trigger_error:
    codice:
    Notice: Undefined property: OOString::$prop5 in C:\xampp\htdocs\index.php on line 7
    in C:\xampp\htdocs\miaclasse.php on line 87
    
    Come posso fare per nasconderla?
    No

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    1,453
    Non puoi definire delle proprietà all'interno di un metodo e non è in quel modo che si utilizza __get()

    http://php.net/manual/it/language.oo...php#object.get

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2014
    residenza
    Voltati
    Messaggi
    913
    e non è in quel modo che si utilizza __get()
    Rispondo così:
    Codice PHP:
    //L'esempio di php.net

    public function __get($name)    {
            echo 
    "Getting '$name'\n";
            if (
    array_key_exists($name$this->data)) {
                return 
    $this->data[$name];
            }
            
    $trace debug_backtrace();        trigger_error(
                
    'Undefined property via __get(): ' $name .
                
    ' in ' $trace[0]['file'] .
                
    ' on line ' $trace[0]['line'],
                
    E_USER_NOTICE);
            return 
    null;
        }

    // Il mio esempio (Ho corretto una cosa, leggi dopo cosa)
    public function __get ($property) {
       switch (
    $property) {
            case 
    "prop1": return $this->prop1;
            case 
    "prop2": return $this->prop2;
            case 
    "prop3": return $this->prop3;
            default:
                
    $backtrace debug_backtrace()[0];
                
    trigger_error("Undefined property: OOString::\$" $property " in <b>" $backtrace["file"] . "</b> on line <b>" $backtrace["line"] . "</b><br/>"E_USER_NOTICE); // linea 87
        
    }

    A parte il fatto che php.net usa un array non cambia niente

    Per il resto ho sbagliato a scrivere qui: ho messo le proprietà $prop1, $prop2, $prop3 all'interno di __get anziché della classe
    Ultima modifica di tampertools; 20-08-2014 a 19:40
    No

  4. #4
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,360
    Sembra non sia possibile. Comunque su php.net uno ho trovato un modo per rendere il messaggio più 'professionale' aggiungendo error Handler.

    Notice: Undefined property: OOString::$prop5 in C:\xampp\htdocs\index.php on line 7 - error handler in C:\xampp\htdocs\miaclasse.php on line 87
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2014
    residenza
    Voltati
    Messaggi
    913
    Questa è una buona idea
    No

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2014
    residenza
    Voltati
    Messaggi
    913
    Ho provato a scrivere questa funzione... che ne dite?

    Codice PHP:
    function default_handler ($message$error$file$line) {
        
    $errors = [
            
    E_ERROR => "Fatal error",
            
    E_USER_ERROR => "Fatal error",
            
    E_WARNING => "Warning",
            
    E_USER_WARNING => "Warning",
            
    E_NOTICE => "Notice",
            
    E_USER_NOTICE => "Notice",
        ];
        echo 
    "<br/><b>" $errors[$error] . "</b>: $message in <b>$file</b> on line <b>$line</b><br/>";
    }
    function 
    throw_error ($message$error E_USER_NOTICE$file null$line null) {
        
    $trace debug_backtrace()[1];
        
    $file is_null($file) ? $trace["file"] : $file;
        
    $line is_null($line) ? $trace["line"] : $line;
        
    $old_handler set_error_handler(null);
        if (
    is_null($old_handler)
           || !
    call_user_func($old_handler$error$message$file$line)
           ) {
            
    default_handler ($message$error$file$line);
        }
        
    restore_error_handler();
        if (
    in_array($error, [E_ERRORE_USER_ERROR])) {
            exit();
        }

    (In realtà le funzioni le ho all'interno della mia classe per ora)

    Funziona così:
    Codice PHP:
    throw_error("Messaggio"E_WARNING"index.php"89); 
    Se non viene fornita la pagina o la linea prende quelle in cui è richiamata la funzione che contiene throw_error(...)
    E 'sta roba funziona anche se viene modificato l'error handler con set_error_handler()
    Ultima modifica di tampertools; 21-08-2014 a 20:17
    No

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.