Recientemente renové mi estructura en preparación para la segunda versión del CMS de nuestra compañía. I undid una gran cantidad de cosas que hice estáticas para reemplazarlas con objetos normales. Al hacerlo, creé una gran cantidad de flexibilidad que solía depender de que yo revisara y pirateara los archivos centrales. Ahora solo uso construcciones estáticas cuando la única alternativa son las funciones globales, que solo está relacionada con la funcionalidad básica de bajo nivel.
Voy a mostrar algunas líneas de mi archivo bootstrap.php (todas mis solicitudes se envían a través de ese archivo, pero puede lograr el mismo resultado al incluirlo en la parte superior de cada archivo) para mostrarle lo que quiero decir. Esta es una versión bastante fuerte de lo que probablemente usarías en tu situación, pero espero que la idea sea útil. (Todo esto es ligeramente modificado.)
//bootstrap.php
...
// CONSTRUCT APPLICATION
{
$Database = new Databases\Mysql(
Constant::get('DATABASE_HOST'),
Constant::get('DATABASE_USER'),
Constant::get('DATABASE_PASSWORD'),
Constant::get('DATABASE_SCHEMA')
);
$Registry = new Collections\Registry;
$Loader = new Loaders\Base;
$Debugger = new Debuggers\Dummy; // Debuggers\Console to log debugging info to JavaScript console
$Application = new Applications\Base($Database, $Registry, $Loader, $Debugger);
}
...
Como se puede ver, tengo todo tipo de opciones para la creación de mi objeto de aplicación, que puedo proporcionado como un argumento en el constructor a otros objetos para darles acceso a estas necesidades "globales".
El objeto de la base de datos se explica por sí mismo. El objeto de registro actúa como un contenedor para el objeto al que deseo acceder en otro lugar de la aplicación. El cargador actúa como una utilidad para cargar otros recursos como archivos de plantilla. Y el depurador está ahí para manejar la salida de depuración.
Puedo, por ejemplo, cambiar la clase de base de datos que instancia y, si tengo una conexión a una base de datos SQLite. Puedo cambiar la clase del depurador (como se indicó) y ahora toda mi información de depuración se registrará en mi consola de JavaScript.
Bien, volviendo al problema. ¿Cómo le da acceso a otros objetos a todo esto? Simplemente pásalo en una discusión al constructor.
// still bootstrap.php
...
// DISPATCH APPLICATION
{
$Router = new Routers\Http($Application);
$Router->routeUri($_SERVER['REQUEST_URI']);
}
...
No solo eso, sino que mi enrutador (o cualquier objeto que construya con él) también es más flexible. Ahora puedo crear una instancia de mi aplicación de forma diferente, y mi router se comportará de manera diferente.
Hola, gracias por su respuesta, es posible guardar variables en clases estáticas. es decir, llamar a la función para verificar si el usuario está conectado, y luego acceder a esta variable varias veces más adelante en la página? –
Sí, para una clase estática hago lo mismo que hice para declarar la variable $ class. Lo único es que 'tienes' que declarar cada variable que usas. –
Pero, el código que te di te permite usar cualquier clase regular, bueno, regularmente. La parte estática simplemente le da la clase, en lugar de globalizarla. Voy a editar para mostrar un poco más. –