Frage

Would Einstellung des $ Link zu meiner Datenbank eine Sache sein, dass ich für einen globalen Bereich verwenden sollte? In meiner Einstellung (viele Funktionen) ... scheint es, als ob nur eine Variable hat, die im globalen Bereich ist klug wäre.

Ich bin derzeit die Funktionen, die es übertragen hin und her, so dass die Art, wie ich es nicht im globalen Bereich habe. Aber es ist ein bisschen ein Hindernis für meinen Skript.

Bitte beraten.

War es hilfreich?

Lösung

Ihr bester Weg, dies zu tun ist durch eine Funktion, da es bereits mit global.

function getDB()
{
   global $Database;
   Return $Database;
}

Dann ganzen Sie Anwendungs ??Verwendung

getDB()->query(...)

Oder wenn Ihr nur die Ressource ruft dann

mysql_query(...,getDB());

Andere Tipps

Ich persönlich denke, die Datenbank ein Ort ist, wo die Singleton Muster Sinn macht. Testen Fanatiker könnten nicht einverstanden mit mir, aber es macht so viel Sinn für mich in diesem Fall.

$db = DB::get();
$db->query('select ...');

Globals sind sehr schlecht, anstatt die Singletonmuster verwenden.

  <?php
  class Singleton
  {
      static private $instances = array();

      static public function getInstance($className)
      {
          if (!isset(self::$instances[$className])) {
              self::$instances[$className] = new $className();
         }
         return self::$instances[$className];
     }
 }
 require_once 'DB.php';
 $db = Singleton::getInstance('DB');
 $db->query("select * .......");
?>

Sie können jederzeit Zugang Globals innerhalb von Funktionen, wenn Sie sie wirklich brauchen.

function use_that_link() {
    global $link;
    var_dump($link);
}

Aber es um vorbei ist wahrscheinlich besser Praxis, unabhängig. Denken Sie daran, dass jede Funktion, die einen direkten Zugriff auf die Datenbank verwendet nimmt die Datenbankverknüpfung als ersten Parameter, und Sie sollten gut zu gehen. (OOP möglicherweise eine noch sauberere Lösung anbieten, aber es klingt wie Sie diesen Weg wagen, nach unten nicht an diesem Punkt wollen.)

Ein pragmatischer Ansatz: rudimentärer Namespacing

$GLOBALS['mydomain.com']['db'] = ...;

Sie können eine Wrapper-Klasse machen für den Zugriff auf und mutieren Ihre Globals

Class Globals {

  private $domain = 'mydomain.com';

  function get($key)
  {
    return $GLOBALS[$this->domain][$key];
  }

  function set($key,$value)
  {
    $GLOBALS[$this->domain][$key] = $value;
  }

}
class Registry
{
    /*
        * @var array Holds all the main objects in an array a greater scope access
        * @access private
    */
    private static $objects = array();

    /**
        * Add's an object into the the global
        * @param string $name
        * @param string $object
        * @return bool
    */
    public static function add($name,$object)
    {
        self::$objects[$name] = $object;
        return true;
    }

    /*
        * Get's an object out of the registry
        * @param string $name
        * @return object on success, false on failure
    */  
    public static function get($name)
    {   if(isset(self::$objects[$name]))
        {
            return self::$objects[$name];
        }
        return false;
    }

    /**
        * Removes an object out of Registry (Hardly used)
        * @param string $name
        * @return bool
    */
    static function remove($name)
    {
        unset(self::$objects[$name]);
        return true;
    }

    /**
        * Checks if an object is stored within the registry
        * @param string $name
        * @return bool
    */
    static function is_set($name)
    {
        return isset(self::$objects[$name]);
    }
}`

Das kann man wie so verwenden.

require_once 'classes/registry.class.php';

require_once 'classes/database/pdo.class.php';
Registry::set('Database',new Database);

überall Dann in Ihrer Anwendung können Sie wie folgt:

function addPost(String $post,Int $id)
{
    $statement = Registry::get('Database')->prepare('INSERT INTO posts VALUES(:d,:p)');
    $statement->bindValue(':p',$id,PDO::PARAM_INT);
    $statement->bindValue(':p',$post);
}

Dies gibt Ihnen einen viel größeren Umfang!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top