Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

constructor clase

Estas en el tema de constructor clase en el foro de Frameworks y PHP orientado a objetos en Foros del Web. hola, estoy terminando de armar una clase para el manejo de errroes que es asi: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original class Errores { public ...
  #1 (permalink)  
Antiguo 28/12/2009, 20:55
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 20 años, 2 meses
Puntos: 43
constructor clase

hola,
estoy terminando de armar una clase para el manejo de errroes que es asi:
Código PHP:
Ver original
  1. class Errores {
  2. public function error_handler($ip=0, $show_user=1, $show_developer=1, $email=NULL, $log_file=NULL,$db_save=1)
  3.     {
  4.         $this->ip = $ip;
  5.         $this->show_user = $show_user;
  6.         $this->show_developer = $show_developer;
  7.         $this->email = mysql_escape_string($email);
  8.         $this->log_file = $log_file;
  9.         $this->log_message = NULL;
  10.         $this->email_sent = false;
  11.         $this->db_save = $db_save;
  12.  
  13.         $this->error_codes =  E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR;
  14.         $this->warning_codes =  E_WARNING | E_CORE_WARNING | E_COMPILE_WARNING | E_USER_WARNING;
  15.  
  16.         //associate error codes with errno...
  17.         $this->error_names = array('E_ERROR','E_WARNING','E_PARSE','E_NOTICE','E_CORE_ERROR','E_CORE_WARNING',
  18.         'E_COMPILE_ERROR','E_COMPILE_WARNING','E_USER_ERROR','E_USER_WARNING',
  19.         'E_USER_NOTICE','E_STRICT','E_RECOVERABLE_ERROR');
  20.  
  21.         for($i=0,$j=1,$num=count($this->error_names); $i<$num; $i++,$j=$j*2)
  22.         $this->error_numbers[$j] = $this->error_names[$i];
  23.     }
  24.  
  25.    
  26.    
  27.     public function handler($errno, $errstr, $errfile, $errline, $errcontext)
  28.     {
  29.         $this->errno = $errno;
  30.         $this->errstr = $errstr;
  31.         $this->errfile = $errfile;
  32.         $this->errline = $errline;
  33.         $this->errcontext = $errcontext;
  34.  
  35.         if($this->log_file)
  36.         $this->log_error_msg();
  37.  
  38.         if($this->email)
  39.         $this->send_error_msg();
  40.  
  41.         if($this->show_user)
  42.         $this->error_msg_basic();
  43.  
  44.         if($this->show_developer && preg_match("/^$this->ip$/i", $_SERVER['REMOTE_ADDR'])) //REMOTE_ADDR : HTTP_X_FORWARDED_FOR
  45.         $this->error_msg_detailed();
  46.  
  47.         /* Don't execute PHP internal error handler */
  48.         return true;
  49.     }
  50.  
  51.  
  52.    
  53.     private function error_msg_basic()
  54.     {
  55.         $message = NULL;
  56.         if($this->errno & $this->error_codes) $message .= "<b> ERROR: </ b> Ha habido un error en el código.";
  57.         if($this->errno & $this->warning_codes) $message .= "<b> ADVERTENCIA: </ b> Ha habido un error en el código.";
  58.  
  59.         if($message) $message .= ($this->email_sent)?" El desarrollador ha sido notificado.<br />\n":"<br />\n";
  60.         echo $message;
  61.     }
  62.  
  63.  
  64.     private function error_msg_detailed()
  65.     {
  66.         //settings for error display...
  67.         $silent = (2 & $this->show_developer)?true:false;
  68.         $context = (4 & $this->show_developer)?true:false;
  69.         $backtrace = (8 & $this->show_developer)?true:false;
  70.  
  71.         switch(true)
  72.         {
  73.             case (16 & $this->show_developer): $color='white'; break;
  74.             case (32 & $this->show_developer): $color='black'; break;
  75.             default: $color='red';
  76.         }
  77.  
  78.         $message =  ($silent)?"<!--\n":'';
  79.         $message .= "<pre style='color:$color;'>\n\n";
  80.         $message .= "archivo: ".print_r( $this->errfile, true)."\n";
  81.         $message .= "linea: ".print_r( $this->errline, true)."\n\n";
  82.         $message .= "código: ".print_r( $this->error_numbers[$this->errno], true)."\n";
  83.         $message .= "mensaje: ".print_r( $this->errstr, true)."\n\n";
  84.         $message .= ($context)?"contexto: ".print_r( $this->errcontext, true)."\n\n":'';
  85.         $message .= ($backtrace)?"backtrace: ".print_r( debug_backtrace(), true)."\n\n":'';
  86.         $message .= "</pre>\n";
  87.         $message .= ($silent)?"-->\n\n":'';
  88.  
  89.         echo $message;
  90.     }
  91.  
  92.  
  93.     private function send_error_msg()
  94.     {
  95.         $message = "archivo: ".print_r( $this->errfile, true)."\n";
  96.         $message .= "linea: ".print_r( $this->errline, true)."\n\n";
  97.         $message .= "código: ".print_r( $this->error_numbers[$this->errno], true)."\n";
  98.         $message .= "mensaje: ".print_r( $this->errstr, true)."\n\n";
  99.         $message .= "log: ".print_r( $this->log_message, true)."\n\n";
  100.         $message .= "contexto: ".print_r( $this->errcontext, true)."\n\n";
  101.         //$message .= "backtrace: ".print_r( $this->debug_backtrace(), true)."\n\n";
  102.  
  103.         $this->email_sent = false;
  104.         if(mail($this->email, 'Error: '.$this->errcontext['SERVER_NAME'].$this->errcontext['REQUEST_URI'], $message, "From: error@".$this->errcontext['HTTP_HOST']."\r\n"))
  105.         $this->email_sent = true;
  106.     }
  107.  
  108.  
  109.     private function log_error_msg()
  110.     {
  111.         $message =  "fecha: ".date("j M y - g:i:s A (T)", mktime())."\n";
  112.         $message .= "archivo: ".print_r( $this->errfile, true)."\n";
  113.         $message .= "linea: ".print_r( $this->errline, true)."\n\n";
  114.         $message .= "código: ".print_r( $this->error_numbers[$this->errno], true)."\n";
  115.         $message .= "mensaje: ".print_r( $this->errstr, true)."\n";
  116.         $message .= "##################################################\n\n";
  117.  
  118.         if (!$fp = fopen($this->log_file, 'a+'))
  119.         $this->log_message = "No se puede abrir / crear el archivo: $this->log_file para log error."; $log_error = true;
  120.  
  121.         if (!fwrite($fp, $message))
  122.         $this->log_message = "No es posible registro de errores para el archivo: $this->log_file. Error de Escritura."; $log_error = true;
  123.  
  124.         if(!$this->log_message)
  125.         $this->log_message = "Error al registrar en el archivo: $this->log_file.";
  126.  
  127.         fclose($fp);
  128.     }
  129. }

bien ahora quisiera agregarle el patron singleton, pero tengo la duda si se puede armar asi:
Código PHP:
Ver original
  1. public static function singleton()
  2.     {
  3.         if( self::$instance == null ) {
  4.             self::$instance = new self($ip=0, $show_user=1, $show_developer=1, $email=NULL, $log_file=NULL,$db_save=1);
  5.         }
  6.  
  7.         return self::$instance;
  8.     }

basicamente mi duda es si en el new self se pueden pasar parametros.

desde ya muchas gracias
  #2 (permalink)  
Antiguo 28/12/2009, 21:55
Avatar de eft0  
Fecha de Ingreso: junio-2003
Ubicación: Santiago - Chile
Mensajes: 635
Antigüedad: 21 años, 6 meses
Puntos: 9
Respuesta: constructor clase

Se supone que no se puede, ya que haces refencia a la instancia ya creada, si no existe, se crea, si existe (una segunda llamada), se devuelve la creada; todas las veces que se solicite. El constructor de la clase siempre debe permanecer "anulado" definiendolo como privado:

Código PHP:
private function __construct() {} 
__________________
eft0's stuff! - http://estebanfernandez.net
  #3 (permalink)  
Antiguo 29/12/2009, 00:50
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 20 años, 5 meses
Puntos: 102
Respuesta: constructor clase

Sí, puedes. De lo que trata el patrón singleton es de tener una sola instancia de un objeto; sí, se debe impedir la instancia directa, pero no significa que no pueda ser inicializado, después de todo, es un objeto.

Para no variar, remitirse a la documentación oficial, donde trae un buen ejemplo del patrón, con el comportamiento del constructor:

www.php.net/language.oop5.patterns

Un ejemplo simple, por si hiciere falta:
Código PHP:
Ver original
  1. class Foo
  2. {
  3.     private static $instance;
  4.     public $param;
  5.  
  6.     private function __construct($param)
  7.     {
  8.         $this->param = $param;
  9.     }
  10.  
  11.     public function singleton($param = null)
  12.     {
  13.         if (self::$instance === null) {
  14.             self::$instance = new self($param);
  15.         }
  16.  
  17.         return self::$instance;
  18.     }
  19. }
  20.  
  21. $foo = Foo::singleton('bar');
  22. var_dump($foo);

Debería funcionar sin problema ... pero si es recomendable, es otro tema.

Viendo como quieres utilizar tu clase cuando aplicas el patrón, se parece mucho a la definición de tu método público de tu clase; de hecho, en su propia definición no tienes constructor... no entiendo entonces el propósito, pero perfectamente puedes llamar el método una vez recuperado/instanciado tu objeto.

Código PHP:
Ver original
  1. $foo = Foo::singleton();
  2. $foo->bar($params);

... o no entendí.

Un saludo
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #4 (permalink)  
Antiguo 29/12/2009, 07:47
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 20 años, 2 meses
Puntos: 43
Respuesta: constructor clase

muchas gracias, a ambos. jam1138 entendiste bien y yo era el que estaba errado pensando que podía hacerlo de mi manera jeje.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:11.