全球都很糟糕!但是我应该在这种情况下使用它们吗?

时间:2010-05-30 00:09:57

标签: php scope globals

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

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

请告知。

6 个答案:

答案 0 :(得分:3)

实现这一目标的最佳方法是使用已经全球化的功能。

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

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

getDB()->query(...)

或者如果您刚刚调用资源

mysql_query(...,getDB());

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

Globals非常糟糕,而是使用单例模式。

  <?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 * .......");
?>

答案 3 :(得分:0)

您确实可以在真正需要时访问函数内的全局变量。

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

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

答案 4 :(得分: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;
  }

}

答案 5 :(得分:-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);
}

这会给你一个更大的范围!