Foros del Web » Programando para Internet » PHP »

Llamando a un metodo se cargan todos

Estas en el tema de Llamando a un metodo se cargan todos en el foro de PHP en Foros del Web. Se cargan todos los metodos ¿conflicto entre clase y metodo? y parece que paso mal $argumentos index.php Código PHP:      if ( is_readable ( $ruta = ...
  #1 (permalink)  
Antiguo 16/03/2015, 17:06
 
Fecha de Ingreso: enero-2008
Mensajes: 580
Antigüedad: 16 años, 3 meses
Puntos: 9
Llamando a un metodo se cargan todos

Se cargan todos los metodos ¿conflicto entre clase y metodo? y parece que paso mal $argumentos

index.php
Código PHP:
    if (is_readable($ruta=ROOT.DS.'controladores'.DS.$controlador.'.php')) {require_once $ruta;}
    
call_user_func_array([new $controlador,$metodo],$argumentos); 
controlador/index.php
Código PHP:
<?php
    
class index {
        function 
index() {
            echo 
__METHOD__;
            
print_r($argumentos);
        }

        function 
hola() {
            echo 
__METHOD__;
            
print_r($argumentos);
        }
    }
?>
Firefox
Cita:
index::index
Notice: Undefined variable: argumentos in C:\xampp\htdocs\controladores\index.php on line 5
index::hola
Notice: Undefined variable: argumentos in C:\xampp\htdocs\controladores\index.php on line 10
  #2 (permalink)  
Antiguo 16/03/2015, 17:22
 
Fecha de Ingreso: enero-2008
Mensajes: 580
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Llamando a un metodo se cargan todos

He cambiado la clase y ya no da problemas, supongo que la forma correcta de pasar los argumentos es mediante el metodo

[PHP]
<?php
class agenda {
function index($argumentos) {
echo __METHOD__;
print_r($argumentos);
}

function hola($argumentos) {
echo __METHOD__;
print_r($argumentos);
}
}
?>
[PHP]
  #3 (permalink)  
Antiguo 16/03/2015, 17:22
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Llamando a un metodo se cargan todos

necesitas pasar $argumentos como parámetro en los métodos
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #4 (permalink)  
Antiguo 16/03/2015, 17:48
 
Fecha de Ingreso: enero-2008
Mensajes: 580
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Llamando a un metodo se cargan todos

vaya, creia que ya lo estaba pasando, uff:
Código PHP:
function index($argumentos) {} 
y a parte del array $argumentos enviado me llega solo el primer contenido
Código PHP:
envio$argumentos=[1,2,3] -> llega$argumentos=
  #5 (permalink)  
Antiguo 16/03/2015, 18:10
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Llamando a un metodo se cargan todos

Es normal estas pasando 3 parámetros y solo tienes declarado uno en tu método
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #6 (permalink)  
Antiguo 16/03/2015, 18:55
 
Fecha de Ingreso: enero-2008
Mensajes: 580
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Llamando a un metodo se cargan todos

Uhmm, Creo que es diferente...

Si lo hago asi y el controlador solo tiene funciones me llega el array $argumentos completo
Código PHP:
if (!function_exists($metodo)) $metodo='e404';        
call_user_func($metodo$argumentos); 
Pero si lo hago asi teniendo las funciones del controlador dentro de una clase solo me llega el primer parametro de $argumentos desvaneciendose el array
Código PHP:
if (!is_callable([$controlador,$metodo])) $metodo='e404';
    if (isset(
$argumentos)) {
        
call_user_func_array([new $controlador,$metodo],$argumentos);
    } else {
        
call_user_func([new $controlador,$metodo]);
    }

  #7 (permalink)  
Antiguo 16/03/2015, 19:03
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Llamando a un metodo se cargan todos

Lo resumiré de esta forma call_user_func_array es para pasar varios parámetros y call_user_func es para pasar solo un parámetro.
Ahora queda mas claro lo que te esta pasando ?
Por favor lee el manual
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #8 (permalink)  
Antiguo 16/03/2015, 20:12
 
Fecha de Ingreso: enero-2008
Mensajes: 580
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Llamando a un metodo se cargan todos

Tendras que disculparme lo mismo he cogido una idea equivocada

Ya pasara por el manual, pero de entrada se me hacen algo confusos los call_user_func:formatos:
Cita:
mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )
mixed call_user_func_array ( callable $callback , array $param_arr )
Supongo que te refieres a que no es lo mismo:
Código PHP:
call_user_func_array(array($controlador,$metodo) ,array('a','b','c') ); 
que:
Código PHP:
$array = array('a','b','c');
call_user_func_array(array($controlador,$metodo) ,$array ); // donde solo me llegaría $array='a' en el controlador;
//Es lo que me desconcierta, envio un array y me llega un vector con la primera posición del array 
Según leo function_user_func() esta presente desde PHP 5.4, como minimo parece que permite llamar a una función aceptanto opcionalmente un segundo parametro a mayores, donde parece que acepta una variable que contiene un array

Según leo function_user_func_array() es mas antigua y necesita los 2 parametros, donde en el siguiente ejemplo lo usan para pasar 2 arrays, el primer array lleva la clase y el metodo mientras que el segundo array lleva los argumentos, lo he visto en:

https://www.youtube.com/watch?v=cQ0o-2aYT2Q
Código PHP:
$argumentos=array('uno','dos','tres','cuatro','cinco')
if (isset(
$argumentos)) {
    
call_user_func_array([new $controlador,$metodo],$argumentos);
} else {
    
call_user_func([new $controlador,$metodo]);


Última edición por quico5; 16/03/2015 a las 20:27
  #9 (permalink)  
Antiguo 17/03/2015, 08:28
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Llamando a un metodo se cargan todos

Sigues sin entender. Cuando tu haces esto:
Código PHP:
Ver original
  1. call_user_func_array(array($controlador,$metodo) ,array('a','b','c') );
El método que tratas de invocar requiere que este esperando 3 parámetros y no uno en su definición.
Revisa los ejemplos del manual: http://php.net/manual/en/function.ca...array-examples
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #10 (permalink)  
Antiguo 17/03/2015, 16:42
 
Fecha de Ingreso: enero-2008
Mensajes: 580
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Llamando a un metodo se cargan todos

Gracias, creo que ya lo voy entendiendo, mando un array, pero al recibirlo, recojo dato a dato por separado:

Código PHP:
<?php
    call_user_func_array
(array('controlador','metodo'), array('a','b','c','d','e') );
    class 
controlador {
        function 
metodo($primero$segundo) {
            echo 
$primero;  //a
            
echo $segundo//b
        
}
    }
?>
En mi caso creo que este es mas practico, porque me permite enviar el propio array que sera pasado despues por un foreach, ademas en los frameworks parece que solo se usa una clase para dicho controlador siendo esta prescindible, pues que yo sepa no se llaman 2 controladores simuntaneamente, supongo que es una medida de protección en muchos casos prescindible:
Código PHP:
call_user_func('metodo' ,array('a','b','c','d','e') );
function 
metodo ($argumentos) { foreach (($argumentos as $argumento) {echo $argumento;} ) } 
si uso call_user_func puedo aprobechar el segundo parametro opcional en caso de pasar un array vacio, pues no da error y me ahorro el usar un if-else

Última edición por quico5; 17/03/2015 a las 17:08

Etiquetas: metodo, variable
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 02:30.