1

データベースへの$linkの設定は、GLOBALスコープを使用する必要があることの1つですか?(多くの関数)の私の設定では...グローバルスコープにある変数を1つだけ持つのが賢明なようです。

私は現在、関数を使用してそれを前後に転送しているので、グローバルスコープにそれを持っていません。しかし、それは私のスクリプトにとって少し邪魔です。

お知らせ下さい。

4

6 に答える 6

3

これを実現する最善の方法は、すでにグローバルになっている関数を使用することです。

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

次に、アプリケーション全体で使用します

getDB()->query(...)

または、リソースを呼び出すだけの場合

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

Singleton個人的には、データベースはパターンが理にかなっている場所の1つだと思います。狂信者をテストすることは私に同意しないかもしれませんが、この場合、それは私にとって非常に理にかなっています。

$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

本当に必要なときに、関数内のグローバルにいつでもアクセスできます。

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

しかし、それを渡すことは、それにもかかわらず、おそらくより良い習慣です。データベースへの直接アクセスを使用する関数はすべて、データベースリンクを最初のパラメーターとして使用することを覚えておいてください。これで、問題なく実行できます。(OOPはさらにクリーンなソリューションを提供するかもしれませんが、現時点ではその道を進んで行きたくないようです。)

于 2010-05-30T00:14:27.367 に答える
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 に答える
-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 に答える