Php 全球都不好!但我应该在这种情况下使用它们吗?

Php 全球都不好!但我应该在这种情况下使用它们吗?,php,scope,globals,Php,Scope,Globals,设置数据库的$link是我应该使用全局作用域的一件事吗?在我的(很多函数)设置中…似乎只有一个全局范围内的变量是明智的 我目前正在使用函数来来回传输它,这样我就不会在全局范围内使用它。但这对我的剧本有点妨碍 请告知。当您真正需要函数时,您可以随时访问函数内部的全局文件 function use_that_link() { global $link; var_dump($link); } 但不管怎样,传递信息可能是更好的做法。请记住,任何使用直接数据库访问的函数都将数据库链接作为

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

我目前正在使用函数来来回传输它,这样我就不会在全局范围内使用它。但这对我的剧本有点妨碍


请告知。

当您真正需要函数时,您可以随时访问函数内部的全局文件

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

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

当您真正需要函数时,您可以随时访问函数内部的全局函数

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

但不管怎样,传递信息可能是更好的做法。请记住,任何使用直接数据库访问的函数都将数据库链接作为其第一个参数,您应该可以使用它。(OOP可能会为您提供一个更干净的解决方案,但听起来您不想在这一点上冒险。)

实现这一点的最佳方法是使用一个函数,因为它已经是全局函数

function getDB()
{
   global $Database;
   Return $Database;
}
然后在整个应用程序中使用

getDB()->query(...)
或者,如果您只是调用资源

mysql_query(...,getDB());

实现这一点的最佳方法是使用已有的函数

function getDB()
{
   global $Database;
   Return $Database;
}
然后在整个应用程序中使用

getDB()->query(...)
或者,如果您只是调用资源

mysql_query(...,getDB());

全局变量非常糟糕,请使用单例模式

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

全局变量非常糟糕,请改用单例模式

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

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

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

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

$db = DB::get();
$db->query('select ...');
你可以这样使用它

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);
}
这将给你一个更大的范围

你可以这样使用它

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

这将给你一个更大的范围

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

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

}

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

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

}

事实上,使用函数可以让您在以后改变对数据库的获取方式(函数内部)的想法。但是我确实看到使用函数而不是全局变量会限制其使用。。。我甚至可以在db函数完成后使用它返回$link…这肯定会让你感觉到如果你创建了唯一的变量名,你可以创建一个函数或静态类,你可以像这样调用全局('Database');在这个函数中,你可以全局$arg1并返回它,所以函数全局($var){global-global$var;return$var;}这样它就会全局化你所要求的字符串,然后返回。我想我可能理解了。总而言之,我所做的一切就是返回非全局变量,从而将其传递给函数。您所做的一切不是使用代码,而是将变量全局化一次,即函数,而不是每次需要它在范围内时编写它,从而调用函数,从而保存代码。我个人会使用静态范围对象。对注册表进行排序,以便您可以转到注册表::set('DB',$Database);因为这是一个全局的,所以您可以执行Registry::get('DB');如果你想看到代码,只要问我,我会把它贴在我的帖子里!事实上,使用函数可以让您在以后改变对数据库的获取方式(函数内部)的想法。但是我确实看到使用函数而不是全局变量会限制其使用。。。我甚至可以在db函数完成后使用它返回$link…这肯定会让你感觉到如果你创建了唯一的变量名,你可以创建一个函数或静态类,你可以像这样调用全局('Database');在这个函数中,你可以全局$arg1并返回它,所以函数全局($var){global-global$var;return$var;}这样它就会全局化你所要求的字符串,然后返回。我想我可能理解了。总而言之,我所做的一切就是返回非全局变量,从而将其传递给函数。您所做的一切不是使用代码,而是将变量全局化一次,即函数,而不是每次需要它在范围内时编写它,从而调用函数,从而保存代码。我个人会使用静态范围对象。对注册表进行排序,以便您可以转到注册表::set('DB',$Database);因为这是一个全局的,所以您可以执行Registry::get('DB');如果你想看到代码,只要问我,我会把它贴在我的帖子里!单例只是一种过于复杂的解决方法,可以使用全局变量。如果应用程序是严格面向对象的,那么它是一种更好的表示法。但在PHP这样的脚本语言中,它有时并不那么有意义。是的。考虑全局值“OK”,当它是只读值时。我想到了这一秒,所以认为这不是一个坏主意,而是用它来思考。记住,调用函数可能有副作用,我只是说没关系,但这并不意味着我不想避免它。在我的web应用程序中,我只有一个地方可以创建连接,我甚至不给它打电话。我让我的基类在创建时初始化它!(想想线程、客户机连接和每个客户机/线程上的新db)您有足够多的类似回复,所以我只做评论。我不会说全球选手绝对不好