Pregunta

Actualmente estoy creando sistema de blog, que espero se convierta en un CMS completo en el futuro.

Hay dos clases / objetos que podrían ser útiles para tener acceso global a (la conexión de base de datos mysqli y una clase personalizada que comprueba si un usuario está conectado).

Estoy buscando una manera de hacer esto sin usar objetos globales, y si es posible, no pasando los objetos para cada función cada vez que se les llama.

¿Fue útil?

Solución

Se podría hacer que los objetos estáticos, entonces usted tiene acceso a ellos en cualquier lugar. Ejemplo:

myClass::myFunction();

Eso funcionará en cualquier parte del guión. Es posible que desee leer en clases estáticas sin embargo, y posiblemente usando una clase Singleton para crear una clase regular en el interior de un objeto estático que se puede utilizar en cualquier lugar.

Ampliado

Creo que lo que estamos tratando de hacer es muy similar a lo que hago con mi clase DB.

class myClass
{
    static $class = false;
    static function get_connection()
    {
        if(self::$class == false)
        {
            self::$class = new myClass;
        }
        return self::$class;
    }
    // Then create regular class functions.
}

Lo que sucede es después de obtener la conexión, utilizando $ objeto = myClass :: get_connection (), usted será capaz de hacer cualquier cosa con regularidad la función.

$object = myClass::get_connection();
$object->runClass();

Ampliado

Una vez que hacer que las declaraciones estáticas, sólo hay que llamar get_connection y asignar el valor devuelto a una variable. A continuación, el resto de las funciones puede tener el mismo comportamiento que una clase que llama con $ class = new MyClass (porque eso es lo que hicimos). Todo lo que está haciendo es almacenar la variable de clase dentro de una clase estática.

class myClass
{
    static $class = false;
    static function get_connection()
    {
        if(self::$class == false)
        {
            self::$class = new myClass;
        }
        return self::$class;
    }
    // Then create regular class functions.
    public function is_logged_in()
    {
        // This will work
        $this->test = "Hi";
        echo $this->test;
    }
}

$object = myClass::get_connection();
$object->is_logged_in();

Otros consejos

Se podía pasar los objetos actualmente a nivel mundial en el constructor.

<?php
  class Foo {
    protected $m_db;
    function __construct($a_db) {
      $this->m_db = $a_db;
    }
  }
?>

Recientemente renovado mi marco en preparación para la segunda versión del CMS de nuestra empresa. I deshizo una gran cantidad de las cosas que hice estática con el fin de sustituirlos por objetos normales. Al hacer esto, he creado una gran cantidad de flexibilidad que solía confiar en mí y pasando por la intrusión en los archivos principales. Ahora sólo uso construcciones estáticas cuando la única alternativa es funciones globales, que sólo está relacionado con la funcionalidad de base de bajo nivel.

Me voy a mostrar unas líneas de mi archivo Bootstrap.php (todas mis peticiones son enviadas a través de ese archivo, pero se puede conseguir el mismo resultado mediante su inclusión en la parte superior de cada archivo) que le muestre lo Quiero decir. Esta es una versión bastante fuerte de lo que probablemente tendría que utilizar en su situación, pero espero que la idea es útil. (Todo esto se modificó ligeramente.)

 //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 base de datos es auto-explicativo. El objeto del Registro actúa como contenedor de objetos es posible que quiera acceder a otras partes 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 crear una instancia y, voilá tengo una conexión a una base de datos SQLite. Puedo cambiar la clase del depurador (como se ha señalado) y ahora toda mi información de depuración se registrará en mi consola de JavaScript.

Bien, ahora de nuevo a la cuestión. ¿Cómo dar otro acceso a objetos de todo esto? Sólo tiene que pasar en un argumento para el constructor.

// still bootstrap.php

...

// DISPATCH APPLICATION

{
    $Router = new Routers\Http($Application);
    $Router->routeUri($_SERVER['REQUEST_URI']); 
}

...

No sólo eso, sino que mi router (o cualquier objeto que construyo con él) es más flexible, también. Ahora sólo puede crear una instancia de mi objeto de aplicación de manera diferente, y mi router se comportan de manera diferente en consecuencia.

Bueno, si ya tiene algún objeto por el cual se refiere al sistema de blog, puede componer estos objetos en que, para que sean $blog->db() y $blog->auth() o lo que sea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top