是否可以在函数范围内自动提供php全局变量?

是否可以在函数范围内自动提供php全局变量?,php,function,scope,globals,Php,Function,Scope,Globals,让我先解释一下。 我有几个全局数据库连接,有几个简单的函数,可以使用每个连接并执行查询等 因为我想不止一次地使用这些连接,为了节省每次在每个函数中定义它们的时间,我在文档顶部将它们创建为全局变量。 然而,我只是想知道,与其写 global $mysql_db1, $mysql_db2, $mysql_db3, $mysql_db4, $mysql_db5; 有没有什么方法可以让我每次都不必复制粘贴它 我知道它很琐碎,但我只是想加快我自己的开发速度,我会创建一个类ConnectionManage

让我先解释一下。 我有几个全局数据库连接,有几个简单的函数,可以使用每个连接并执行查询等

因为我想不止一次地使用这些连接,为了节省每次在每个函数中定义它们的时间,我在文档顶部将它们创建为全局变量。 然而,我只是想知道,与其写

global $mysql_db1, $mysql_db2, $mysql_db3, $mysql_db4, $mysql_db5;
有没有什么方法可以让我每次都不必复制粘贴它


我知道它很琐碎,但我只是想加快我自己的开发速度,

我会创建一个类ConnectionManager来存储这些连接,并使用db为任何函数使用该类的实例:)


如果您不想每次都放入参数,那么使用单例也是一个好主意。

我将创建一个类ConnectionManager来存储这些连接,并使用db:)为任何函数使用该类的实例


如果您不想每次都放入参数,那么使用单例也是一个好主意。

您最好以面向对象的方式声明它们,例如作为单例的属性,然后以这种方式访问它们。如果您坚持以一种会让后续开发人员感到悲伤的方式来做事情,那么您可以使用数组。Globals只是个坏主意,坦率地说,我希望这个关键词能从语言中删除

您可以使用的东西的一个非常简单的版本:

class ConnectionHolder
{
    public $mysql_db1;

    private static $inst;
    public static &getInstance()
    {
        if( !self::$inst )
            self::$inst = new ConnectionHolder();
        return self::$inst;
    }

    private function __construct()
    {
        $this->mysql_db1 = // ... you may want another nameing convension.
        // yada yada
    }
}
然后,在您的功能中:

$ch =& ConnectionHolder::getInstance()
$ch->mysql_db1;

最好的方法是以面向对象的方式声明它们,比如说作为单例的属性,然后以这种方式访问它们。如果您坚持以一种会让后续开发人员感到悲伤的方式来做事情,那么您可以使用数组。Globals只是个坏主意,坦率地说,我希望这个关键词能从语言中删除

您可以使用的东西的一个非常简单的版本:

class ConnectionHolder
{
    public $mysql_db1;

    private static $inst;
    public static &getInstance()
    {
        if( !self::$inst )
            self::$inst = new ConnectionHolder();
        return self::$inst;
    }

    private function __construct()
    {
        $this->mysql_db1 = // ... you may want another nameing convension.
        // yada yada
    }
}
然后,在您的功能中:

$ch =& ConnectionHolder::getInstance()
$ch->mysql_db1;

通吃通常被认为是坏习惯。我不会对你吹毛求疵,但请看这篇文章:

您可以使用
$GLOBALS
超全局访问在全局范围()中定义的任何变量。因此,在您的示例代码中,只需使用
$GLOBALS['mysql_db1']
就相当于使用
global$mysql_db1
然后使用
$mysql\u db1

我要强调的是,这项计划有多么糟糕。在整个开发过程中,您可能对它都很满意,但是可怜的Johnny Nextguy,如果您包含一个也使用globals的第三方脚本,那么代码之神可能会拯救您。。。变量名之间存在冲突。现在你有机会了

正如所建议的,最好将数据库功能封装在类中。如果使用静态类,您仍然可以获得全局变量的所有好处,而不会受到范围的污染或被覆盖的危险

下面是一个示例数据库类及其用法:

// put this in a library file or some place that all scripts include
require_once('database_class.php');
$db = new db(array(
 'host'=>'localhost'
 'user'=>'db_user_name'
 'password'=>'db_password',
 'database_name'=>'my_database'
));


// now anywhere in code you want to use it
$array = db::getRows('SELECT id, name FROM users');
$field = db::getField('SELECT name FROM users WHERE id=10');


<?php
// database_class.php
class db {
    static protected $resource_link = null;

    function __construct($args=false) {
        if ($args===false || !is_array($args))
            return false;
        if (
            !isset($args['host']) ||
            !isset($args['user']) ||
            !isset($args['password']) || 
            !isset($args['database_name'])
        )
            return critical_error('Missing database configuration data.');


        self::$resource_link = @mysql_connect($args['host'],$args['user'],$args['password']);
        if (!self::$resource_link)
             return critical_error('Error connecting to database 2001.  MySQL said:<br>'.mysql_error());
        @mysql_select_db($args['database_name'],  self::$resource_link);
        return;
    }


    // return a single-dimmension array of fields as string
    static public function getFields ($sql=false, $field=false) {
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj) {
                $res = array();
                 while ($this_row = mysql_fetch_array($query_obj)) {
                    if ($field !== false && isset($this_row[$field]))
                        $res[] = $this_row[$field];
                    else
                        $res[] = $this_row[0];
                }
            } // end :: if query object is not null
        } // end :: if $sql is not false
        return $res;
    }

    // return a single-dimmension array of fields as string with keyfield as key
    static public function getKeyFields ($sql=false, $key_field='id', $list_field='id') {
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj) {
                 while ($this_row = mysql_fetch_array($query_obj)) {
                    if (isset($this_row[$key_field]))
                        $res[$this_row[$key_field]] = $this_row[$list_field];
                }
            } // end :: if query object is not null
        } // end :: if $sql is not false
        return $res;
    }

    // return a single field as string from the first row of results
    static public function getField ($sql=false) {
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj) {
                $this_array = mysql_fetch_array($query_obj);
                if (is_array($this_array))
                    return $this_array[0];
            } // end :: if query object is not null
        } // end :: if $sql is not false
        return $res;
    }

    // return a single row as an array
    static public function getRow ($sql=false) {  
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj)
                $res = mysql_fetch_assoc($query_obj);
        } // end :: if $sql is not false
        return $res;
    }

    // return an array of rows as arrays of strings
    static public function getRows ($sql=false) {
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            $res = array();
            if ($query_obj) {
                 while ($this_row = mysql_fetch_assoc($query_obj)) {
                    $res[] = $this_row;
                }
            } // end :: if query object is not null
        } // end :: if $sql is not false
        return $res;
    }

    // return an array of rows as arrays of strings, using specified field as main array keys
    static public function getKeyRows ($sql=false, $key_field='id', $include_key_in_results=true) {
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj) {
                $res = array();
                 while ($this_row = mysql_fetch_assoc($query_obj)) {
                    if (isset($this_row[$key_field])) {
                        $res[$this_row[$key_field]] = $this_row;
                        if ($include_key_in_results == false)
                            unset($res[$this_row[$key_field]][$key_field]);
                    } // end :: if checking for key field in result array
                } // end :: while looping query obj
            } // end :: if query object is not null
        } // end :: if $sql is not false
        return $res;
    }


    // do an update query, return true if no error occurs
    static public function update ($sql=false) {
        $res = false;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj && strlen(mysql_error()) < 1)
                $res = true;
        }
        return $res;
    }

    // do an insert query, return the auto increment ID (if there is one)
    static public function insert ($sql=false) {
        $res = null;
        if ($sql !== false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj)
                $res = mysql_insert_id(self::$resource_link);
        }
        return $res;
    }    
}
?>
//将其放入库文件或所有脚本都包含的某个位置
需要_once('database_class.php');
$db=新的db(数组)(
“主机”=>“本地主机”
'user'=>'db\u user\u name'
“密码”=>“数据库密码”,
“数据库名称”=>“我的数据库”
));
//现在,在代码中的任何地方都可以使用它
$array=db::getRows('SELECT id,name FROM users');
$field=db::getField('SELECT name FROM users,其中id=10');

通配符通常被视为坏习惯。我不会对你吹毛求疵,但请看这篇文章:

您可以使用
$GLOBALS
超全局访问在全局范围()中定义的任何变量。因此,在您的示例代码中,只需使用
$GLOBALS['mysql_db1']
就相当于使用
global$mysql_db1
然后使用
$mysql\u db1

我要强调的是,这项计划有多么糟糕。在整个开发过程中,您可能对它都很满意,但是可怜的Johnny Nextguy,如果您包含一个也使用globals的第三方脚本,那么代码之神可能会拯救您。。。变量名之间存在冲突。现在你有机会了

正如所建议的,最好将数据库功能封装在类中。如果使用静态类,您仍然可以获得全局变量的所有好处,而不会受到范围的污染或被覆盖的危险

下面是一个示例数据库类及其用法:

// put this in a library file or some place that all scripts include
require_once('database_class.php');
$db = new db(array(
 'host'=>'localhost'
 'user'=>'db_user_name'
 'password'=>'db_password',
 'database_name'=>'my_database'
));


// now anywhere in code you want to use it
$array = db::getRows('SELECT id, name FROM users');
$field = db::getField('SELECT name FROM users WHERE id=10');


<?php
// database_class.php
class db {
    static protected $resource_link = null;

    function __construct($args=false) {
        if ($args===false || !is_array($args))
            return false;
        if (
            !isset($args['host']) ||
            !isset($args['user']) ||
            !isset($args['password']) || 
            !isset($args['database_name'])
        )
            return critical_error('Missing database configuration data.');


        self::$resource_link = @mysql_connect($args['host'],$args['user'],$args['password']);
        if (!self::$resource_link)
             return critical_error('Error connecting to database 2001.  MySQL said:<br>'.mysql_error());
        @mysql_select_db($args['database_name'],  self::$resource_link);
        return;
    }


    // return a single-dimmension array of fields as string
    static public function getFields ($sql=false, $field=false) {
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj) {
                $res = array();
                 while ($this_row = mysql_fetch_array($query_obj)) {
                    if ($field !== false && isset($this_row[$field]))
                        $res[] = $this_row[$field];
                    else
                        $res[] = $this_row[0];
                }
            } // end :: if query object is not null
        } // end :: if $sql is not false
        return $res;
    }

    // return a single-dimmension array of fields as string with keyfield as key
    static public function getKeyFields ($sql=false, $key_field='id', $list_field='id') {
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj) {
                 while ($this_row = mysql_fetch_array($query_obj)) {
                    if (isset($this_row[$key_field]))
                        $res[$this_row[$key_field]] = $this_row[$list_field];
                }
            } // end :: if query object is not null
        } // end :: if $sql is not false
        return $res;
    }

    // return a single field as string from the first row of results
    static public function getField ($sql=false) {
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj) {
                $this_array = mysql_fetch_array($query_obj);
                if (is_array($this_array))
                    return $this_array[0];
            } // end :: if query object is not null
        } // end :: if $sql is not false
        return $res;
    }

    // return a single row as an array
    static public function getRow ($sql=false) {  
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj)
                $res = mysql_fetch_assoc($query_obj);
        } // end :: if $sql is not false
        return $res;
    }

    // return an array of rows as arrays of strings
    static public function getRows ($sql=false) {
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            $res = array();
            if ($query_obj) {
                 while ($this_row = mysql_fetch_assoc($query_obj)) {
                    $res[] = $this_row;
                }
            } // end :: if query object is not null
        } // end :: if $sql is not false
        return $res;
    }

    // return an array of rows as arrays of strings, using specified field as main array keys
    static public function getKeyRows ($sql=false, $key_field='id', $include_key_in_results=true) {
        $res = null;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj) {
                $res = array();
                 while ($this_row = mysql_fetch_assoc($query_obj)) {
                    if (isset($this_row[$key_field])) {
                        $res[$this_row[$key_field]] = $this_row;
                        if ($include_key_in_results == false)
                            unset($res[$this_row[$key_field]][$key_field]);
                    } // end :: if checking for key field in result array
                } // end :: while looping query obj
            } // end :: if query object is not null
        } // end :: if $sql is not false
        return $res;
    }


    // do an update query, return true if no error occurs
    static public function update ($sql=false) {
        $res = false;
        if ($sql!==false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj && strlen(mysql_error()) < 1)
                $res = true;
        }
        return $res;
    }

    // do an insert query, return the auto increment ID (if there is one)
    static public function insert ($sql=false) {
        $res = null;
        if ($sql !== false) {
            $query_obj = mysql_query($sql, self::$resource_link);
            if ($query_obj)
                $res = mysql_insert_id(self::$resource_link);
        }
        return $res;
    }    
}
?>
//将其放入库文件或所有脚本都包含的某个位置
需要_once('database_class.php');
$db=新的db(数组)(
“主机”=>“本地主机”
'user'=>'db\u user\u name'
“密码”=>“数据库密码”,
“数据库名称”=>“我的数据库”
));
//现在,在代码中的任何地方都可以使用它
$array=db::getRows('SELECT id,name FROM users');
$field=db::getField('SELECT name FROM users,其中id=10');

直接回答您的问题:否

对你的问题的一个实际的回答指出,全球化并不是一个热门的想法。请注意,我认为大多数的论据都是无效的,都是围绕着其他人说“哇,太恶心了!”或“你会释放魔鬼!”

然而,它们都围绕着这一问题跳来跳去:如果程序的两个部分试图使用相同的全局变量
$foo
用于不同的目的(即,它们意外地决定使用相同的名称),那么不能保证会发生错误。这就是为什么建议使用不同的存储方法,例如类,因为两个名为
Foo
的类肯定会导致错误


在您的程序上下文中,您可能会建议创建一个
ConnectionManager
singleton,您可以通过编写类似
$conn1=ConnectionManager::getConnection('conn1')的内容来获取数据库连接

直接回答您的问题:否

对你的问题的一个实际的回答指出,globals不是