Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] POO, __destruct() no se carga de último

Estas en el tema de POO, __destruct() no se carga de último en el foro de PHP en Foros del Web. No se porque se carga de último la función "index()" en lugar de "__destruct()" Código PHP: <?php      class  portada {         public function  __construct (){              ...
  #1 (permalink)  
Antiguo 21/03/2018, 16:57
 
Fecha de Ingreso: enero-2008
Mensajes: 571
Antigüedad: 12 años
Puntos: 9
POO, __destruct() no se carga de último

No se porque se carga de último la función "index()" en lugar de "__destruct()"

Código PHP:
<?php
    
class portada{
        public function 
__construct(){
            
html::head('Titulo');
            
html::nav();
        }
        public function 
index(){
            include_once 
'portada_index.php';
        }
        public function 
__destruct(){
            echo 
'</body></html>';
        }
    }
?>

Última edición por quico5; 21/03/2018 a las 20:51
  #2 (permalink)  
Antiguo 21/03/2018, 22:07
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 6 años, 6 meses
Puntos: 379
Respuesta: POO, __destruct() no se carga de último

Por si solo lo que pones no ayuda en nada, con lo que pones solo te puedo decir que destruct se llama inmediatamente después de la ultima referencia que se haga al objeto o cuando se elimina explicitamente. Te sugiero que pongas como usas esta clase en tu código.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 22/03/2018, 05:05
 
Fecha de Ingreso: enero-2008
Mensajes: 571
Antigüedad: 12 años
Puntos: 9
Respuesta: POO, __destruct() no se carga de último

Hola @hhs, gracias por responder

Esa clase es llamada desde este archivo

Código PHP:
<?php spl_autoload_register(function($clase){include"$clase.php";});
        
        
# Probamos $_SERVER
        #print('<pre>');print_r($_SERVER);print('</pre>');
        
        # Definimos algunas constantes.
        
define('DS',DIRECTORY_SEPARATOR);
        
define('ROOT',realpath(dirname(__FILE__)).DS);
        
define('URL',dirname($_SERVER['PHP_SELF']));

        
# Definimos: Controlador, Modelo y Argumentos.
        
$args=array_filter(explode('/',filter_input(INPUT_GET,'url',FILTER_SANITIZE_URL)));
        
#print('<pre>'.$cont);print_r($args);print('</pre>');
        
$cont=strtolower(array_shift($args))?:'portada';
        
$metd=strtolower(array_shift($args))?:'index';
        
        
# Comprobamos que el Controlador es funcional.
        
$file=ROOT.'controller_'.$cont.'.php';
        
is_readable($file) ? require_once $file : exit('Controlador no disponible.') ;

        
# Comprobamos que el Metodo es funcioanl
        
$metd=method_exists(new $cont,$metd) ? $metd 'error' ;

        
# Pasamos los parametos al Controlador.
        #isset($args) ? call_user_func_array([$cont,$metd],$args) : call_user_func([$cont,$metd]) ;
        
call_user_func_array([$cont,$metd],$args);

?>
Tengo otro archivo que viene a ser una especie de core:

Código PHP:
<?php class html{


    public function 
head($titulo){include'html'.DS.__FUNCTION__.'.phtml';}
    public function 
foot(){include'html'.DS.__FUNCTION__.'.phtml';}
    public function 
nav(){include'html'.DS.__FUNCTION__.'.phtml';}
    public function 
card($figcaption,$img){include'html'.DS.__FUNCTION__.'.phtml';}

}
  #4 (permalink)  
Antiguo 22/03/2018, 13:36
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 6 años, 6 meses
Puntos: 379
Respuesta: POO, __destruct() no se carga de último

Muy bien el error se encuentra en esta linea
Código PHP:
Ver original
  1. # Comprobamos que el Metodo es funcioanl
  2. $metd=method_exists(new $cont,$metd) ? $metd : 'error' ;
Estas creando la instancia en el scope de la función method_exist cuando la función finaliza se hace la llamada a destruct;es por eso que index se ejecuta después cuando haces la llamada mediante call_user_func_array. Solo necesitas crear la instancia fuera de la función y con eso debe de funcionar como esperas.
Código PHP:
Ver original
  1. # Comprobamos que el Controlador es funcional.
  2.        $file=ROOT.'controller_'.$cont.'.php';
  3.         is_readable($file) ? require_once $file : exit('Controlador no disponible.') ;
  4.  
  5.         $cont = new $cont;
  6.         # Comprobamos que el Metodo es funcioanl
  7.        $metd=method_exists($cont,$metd) ? $metd : 'error' ;
  8.  
  9.         # Pasamos los parametos al Controlador.
  10.        isset($args) ? call_user_func_array([$cont,$metd],$args) : call_user_func([$cont,$metd]) ;
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Última edición por hhs; 22/03/2018 a las 13:43

Etiquetas: poo
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 17:53.