データベースへの$linkの設定は、GLOBALスコープを使用する必要があることの1つですか?(多くの関数)の私の設定では...グローバルスコープにある変数を1つだけ持つのが賢明なようです。
私は現在、関数を使用してそれを前後に転送しているので、グローバルスコープにそれを持っていません。しかし、それは私のスクリプトにとって少し邪魔です。
お知らせ下さい。
これを実現する最善の方法は、すでにグローバルになっている関数を使用することです。
function getDB()
{
global $Database;
Return $Database;
}
次に、アプリケーション全体で使用します
getDB()->query(...)
または、リソースを呼び出すだけの場合
mysql_query(...,getDB());
Singleton
個人的には、データベースはパターンが理にかなっている場所の1つだと思います。狂信者をテストすることは私に同意しないかもしれませんが、この場合、それは私にとって非常に理にかなっています。
$db = DB::get();
$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 * .......");
?>
本当に必要なときに、関数内のグローバルにいつでもアクセスできます。
function use_that_link() {
global $link;
var_dump($link);
}
しかし、それを渡すことは、それにもかかわらず、おそらくより良い習慣です。データベースへの直接アクセスを使用する関数はすべて、データベースリンクを最初のパラメーターとして使用することを覚えておいてください。これで、問題なく実行できます。(OOPはさらにクリーンなソリューションを提供するかもしれませんが、現時点ではその道を進んで行きたくないようです。)
より実用的なアプローチ:基本的な名前空間
$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;
}
}
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);
}
これにより、はるかに広い範囲が得られます。