将$ link设置为我的数据库是否应该使用GLOBAL范围?在我的(很多函数)的设置中...似乎只有一个变量在全局范围内是明智的。
我目前正在使用这些函数来回传输它,这样我在全局范围内就没有它。但这对我的剧本来说是一个障碍。
请告知。
答案 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);
}
这会给你一个更大的范围!