Esto es probablemente algo básico, pero no soy un desarrollador capacitado, así que tengan paciencia conmigo.

Mi pregunta es: ¿Cómo puedo obtener una clase en php "global" para poder inicializarla fuera de una llamada a una función, pero seguir utilizándola dentro?

Este ejemplo muestra lo que quiero lograr, pero aparentemente no funciona:

$view = new Smarty();

$view->debugging = false;
$view->caching = false;
$view->cache_lifetime = 1;
$view->setTemplateDir('../views/');

$app->get('/register', function (Request $request, Response $response) {    
    $param = $request->getParams();

    $view->assign('name', $param["name"]);
    $response = $view->display('index.html');

    return $response;
});

Para que funcione, tengo que definirlo dentro de $ app-> get call. Luego, por supuesto, $ view-> debugging, etc.también debe configurarse dentro de $ app-> get call.

El propósito de esto es evitar tener que inicializar una nueva instancia de $ view para cada llamada y conseguir que la configuración predeterminada sea global.

Editar: Tal vez fuera demasiado rápido para hacer la pregunta aquí. Después de una búsqueda en Google, creo que puedo encontrar la solución. Pero usando "global $ view" dentro de la función obtengo acceso a la instancia de la clase. Esto es diferente de otros lenguajes en los que establece "public $ variable = new class.function ()" pero probablemente haya una razón para que sea así, y definitivamente puedo ver cómo esto puede ser una ventaja para la seguridad / rendimiento, etc. hay alguna forma alternativa? ¿Cuáles son los pros y los contras?

0
chranmat 14 dic. 2016 a las 23:47

2 respuestas

La mejor respuesta

El uso de variables globales no se considera una buena práctica; hace que el código sea muy difícil de probar. Consulte ¿Por qué el estado global es tan malo? Por lo general, desea realizar una inyección de dependencia:

function doSomething($obj)
{
    // code here
}

$foo = new MyClass();
doSomething($foo);

Por supuesto, eso puede ser complicado cuando se trabaja con un marco potencialmente obstinado.

Una mejor solución en su caso es utilizar la use palabra clave para heredar la variable del alcance local en lugar del alcance global, como en:

$app->get('/register', function (Request $request, Response $response) use ($view) {
    $param = $request->getParams();

    $view->assign('name', $param["name"]);
    $response = $view->display('index.html');

    return $response;
});

Si debe usar un global, simplemente use el palabra clave global:

$app->get('/register', function (Request $request, Response $response) {    
    global $view;
    $param = $request->getParams();

    $view->assign('name', $param["name"]);
    $response = $view->display('index.html');

    return $response;
});
2
Community 13 abr. 2017 a las 12:45

En este caso específico, usaría un cierre, como este:

$app->get('/register', function (Request $request, Response $response) 
    use ($view) { 
  // ... code ... $view is defined here
}

También puede llamar al uso por referencia (es decir, use (&$view)) para poder modificar la variable en el alcance del cierre.

Consulte la documentación en el manual de PHP: http://php.net/manual/en/functions .anónimo.php.

0
Palantir 14 dic. 2016 a las 20:56