1

将 $link 设置到我的数据库是我应该使用 GLOBAL 范围的一件事吗?在我的(很多函数)设置中......似乎只有一个变量在全局范围内是明智的。

我目前正在使用这些函数来回传输它,这样我就没有它在全局范围内。但这对我的脚本来说有点障碍。

请指教。

4

6 回答 6

3

实现这一点的最佳方法是使用已经存在全局的函数。

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

然后在整个应用程序使用中

getDB()->query(...)

或者,如果您只是调用资源,那么

mysql_query(...,getDB());
于 2010-05-30T00:16:39.483 回答
2

就个人而言,我认为数据库是该Singleton模式有意义的地方。测试狂热者可能不同意我的观点,但在这种情况下对我来说很有意义。

$db = DB::get();
$db->query('select ...');
于 2010-05-30T00:24:18.227 回答
1

全局变量非常糟糕,而是使用单例模式。

  <?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 * .......");
?>
于 2010-05-30T00:21:42.800 回答
0

更实用的方法:基本的命名空间

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

}
于 2010-05-30T07:19:07.157 回答
0

当你真正需要它们时,你总是可以访问函数内部的全局变量。

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

但无论如何,传递它可能是更好的做法。请记住,任何使用直接数据库访问的函数都将数据库链接作为其第一个参数,您应该很高兴。(OOP 可能会为您提供更清洁的解决方案,但听起来您现在不想冒险走这条路。)

于 2010-05-30T00:14:27.367 回答
-1
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);
}

这将为您提供更大的范围!

于 2010-05-30T01:27:53.880 回答