PHP - Me puede explicar el uso de esta funcion?

 
Vista:
sin imagen de perfil
Val: 51
Ha aumentado su posición en 3 puestos en PHP (en relación al último mes)
Gráfica de PHP

Me puede explicar el uso de esta funcion?

Publicado por Miguel (32 intervenciones) el 09/10/2018 01:15:20
Hola, estoy aprendiendo php orientado a objetos y estoy siguiendo un curso para hacer un framework con php mvc, pero estas sentencias no las entiendo, a ver si alguien me puede explicar su funcion.

Aqui no entiendo cual es la funcion del new
1
2
require_once('../app/controllers/'. $this->actualController . '.php');
$this->actualController = new $this->actualController;

Y aqui no se para que se utiliza la funcion call_user_func_array y tampoco se que hizo con la variable parameters

1
2
3
$this->parameters = $url ? array_values($url) : [];
 
call_user_func_array([$this->actualController,$this->actualMethod],$this->parameters);

Aqui les dejo el codigo completo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
 
//TRAER LA URL INGRESADA
 
class Core{
    protected $actualController = 'pages';
    protected $actualMethod = 'index';
    protected $parameters = [];
 
    public function __construct(){
        //EJECUTA LA FUNCION PARA OBTENER LA URL Y LO ALMACENA EN LA VARIABLE URL
        $url = $this->getUrl();
 
        //VERIFICA SI EXISTE EL ARCHIVO EN EL DIRECTORIO CONTROLLERS A PARTIR DE LA URL
        if(file_exists('../app/controllers/'. ucwords($url[0]). '.php')){
 
            $this->actualController = ucwords($url[0]);
 
            //ELIMINA EL ELEMENTO DEL ARRAY CORRESPONDIENTE AL CONTROLADOR
            unset($url[0]);
 
        }
 
        require_once('../app/controllers/'. $this->actualController . '.php');
        $this->actualController = new $this->actualController;
 
        //SI EL METODO SE ENCUENTRA EN LA URL VERIFICA SI EL METODO EXISTE
        if(isset($url[1])){
            if(method_exists($this->actualController, $url[1])){
 
                $this->actualMethod = $url[1];
 
                //ELIMINA EL ELEMENTO DEL ARRAY CORRESPONDIENTE AL METODOL
                unset($url[1]);
            }
        }
 
        $this->parameters = $url ? array_values($url) : [];
 
        call_user_func_array([$this->actualController,$this->actualMethod],$this->parameters);
    }
 
    //OBTIENE LA URL, VERIFICA SI TIENE ESPACIOS DESPUES DE LA CADENA, LE QUITA CARACTERES EXTRAÑOS Y CONVIERTE EN UN ARRAY CADA PARTE DE LA URL
    public function getUrl(){
        if(isset($_GET['url'])){
            $url = rtrim($_GET['url'], '/');
            $url = filter_var($url, FILTER_SANITIZE_URL);
            $url = explode('/', $url);
            return $url;
        }
    }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Me puede explicar el uso de esta funcion?

Publicado por Mauro (1032 intervenciones) el 16/10/2018 00:28:22
Para empezar, me parece un poco fuerte desarrollar un framework MVC al mismo tiempo que aprendes POO :p

Esta línea:

1
$this->actualController = new $this->actualController;

La veo algo problemática... Lo que está haciendo es (del lado derecho del igual) crear un objeto de clase $this->actualController; (Es decir, usa el contenido de $this->actualController como nombre de la clase que va a utilizar para crear el objeto) y luego ese objeto lo referencia mediante $this->actualController (!!).

Esta es una práctica muy poco aconsejable... la variable empieza teniendo un string (nombre de la clase) y luego termina teniendo un objeto... como mínimo es raro...

1
$this->parameters = $url ? array_values($url) : [];

La sintaxis ... ? ... : ... es lo que se conoce como un "if inmediato" o "inline".

Es una abreviatura de:

1
2
3
4
5
6
7
<?php
 
if ( $url ) {
   $this->parameters = array_values($url);
} else {
   $this->parameters = [];
}

1
call_user_func_array([$this->actualController,$this->actualMethod],$this->parameters);

Se está usando la función call_user_func_array (En realidad deberías pensarla como una "meta-función") para invocar el método cuyo nombre es el valor de $this->actualMethod (de la clase cuyo nombre es el valor de $this->actualController) pasándole los parámetros contenidos en el array $this->parameters).

Es un uso bastante avanzado de PHP para alguien que recién está comenzando con POO (En mi opinión).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Me puede explicar el uso de esta funcion?

Publicado por florecio (1 intervención) el 15/08/2020 02:15:00
Yo estoy iniciando en desarrollo con poo , pero si entendí su explicación gracias de verdad.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Me puede explicar el uso de esta funcion?

Publicado por Mauro (1032 intervenciones) el 15/08/2020 17:42:15
Excelente amigo! Me alegra ayudar :)

Si te interesa profundizar sobre POO con PHP he escrito este libro.

Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar