Глобалы плохие! Но я должен использовать их в этом контексте? - PullRequest
1 голос
/ 30 мая 2010

Будет ли установка $ link для моей базы данных одной вещью, для которой я должен использовать область GLOBAL? В моей настройке (много функций) ... кажется, что было бы разумно иметь только одну переменную, которая находится в глобальной области видимости.

В настоящее время я использую функции для передачи его туда и обратно, чтобы его не было в глобальной области видимости. Но это немного мешает моему сценарию.

Пожалуйста, сообщите.

Ответы [ 6 ]

3 голосов
/ 30 мая 2010

Ваш лучший способ сделать это - использовать уже существующую глобальную функцию.

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

Тогда во всем вашем приложении используйте

getDB()->query(...)

Или, если вы просто вызываете ресурс,

mysql_query(...,getDB());
2 голосов
/ 30 мая 2010

Лично я думаю, что база данных - это то место, где шаблон Singleton имеет смысл. Тестирование фанатиков может не согласиться со мной, но в этом случае это имеет для меня большой смысл.

$db = DB::get();
$db->query('select ...');
1 голос
/ 30 мая 2010

Глобалы очень плохи, вместо этого используйте шаблон синглтона.

  <?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 * .......");
?>
0 голосов
/ 30 мая 2010

Более прагматичный подход: элементарное пространство имен

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

Вы можете создать класс-оболочку для доступа к глобальным переменным и их изменения

Class Globals {

  private $domain = 'mydomain.com';

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

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

}
0 голосов
/ 30 мая 2010
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]);
    }
}`

Вы можете использовать так.

require_once 'classes/registry.class.php';

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

Тогда в любом месте вашего приложения вы можете сделать так:

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);
}

Это даст вам гораздо больше возможностей!

0 голосов
/ 30 мая 2010

Вы всегда можете получить доступ к глобальным переменным внутри функций, когда они вам действительно нужны.

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

Но раздавать его, наверное, лучше, независимо от практики. Просто помните, что любая функция, использующая прямой доступ к базе данных, принимает в качестве первого параметра ссылку на базу данных, и вам следует идти вперед. (ООП может предложить вам более чистое решение, но похоже, что вы не хотите идти по этому пути в этот момент.)

...