【问题标题】:How do i use variables in an array within a function?如何在函数内的数组中使用变量?
【发布时间】:2011-02-26 13:49:34
【问题描述】:

配置.php:

$settings = array();

$settings['mysqlhost'] = 'localhost'; // Mysql hostname
$settings['mysqluser'] = '**'; // Mysql username
$settings['mysqlpass'] = '**'; // Mysql password
$settings['mysqldatb'] = '**'; // Mysql database

functions.php:

include_once('config.php'); 

function si_connect_db(){

    $connection = mysql_connect($settings['mysqlhost'], $settings['mysqluser'], $settings['mysqlpass']);
    $selectdb = mysql_select_db($settings['mysqldatb'], $connection);

    if($connection){
        if($selectdb){
            return true;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return false;
    }
}

现在,例如:

include_once('functions.php');
si_connect_db();

我没有连接...我该怎么做?

【问题讨论】:

    标签: php mysql connect mysql-connect


    【解决方案1】:

    默认情况下,在函数外部声明的 PHP 变量在函数内部不可见。


    如果您在函数外部声明一个变量,并希望它在该函数内部可见,则必须使用 global 关键字:

    function si_connect_db(){
    
        global $settings; // Make $settings visible inside the function
    
        $connection = mysql_connect($settings['mysqlhost'], $settings['mysqluser'], $settings['mysqlpass']);
        $selectdb = mysql_select_db($settings['mysqldatb'], $connection);
    
        ...
    


    有关更多信息,您应该查看手册的Variable scope 部分。

    【讨论】:

      【解决方案2】:

      您应该将$settings 设为全局变量

      function si_connect_db(){
         global $settings;
      

      http://php.net/manual/en/language.variables.scope.php

      【讨论】:

      • 绝对没有!全球都是邪恶的!
      • 它只是解决了问题。看我的回答。
      • @Charlie Pigarelli,没问题(赞成),但如果 $settings 不仅包含数据库设置?
      • 嗯,这是一个不同的故事。我建议将 db 设置保存在一个文件中,而将其他设置保存在不同的文件中,这也是为了设计问题。 ;)
      【解决方案3】:

      您必须在函数中使用 global 关键字才能让函数知道 $settings 是全局的。

      最好使用define() 来定义全局常量,例如:

      define(MYSQLHOST, 'localhost');
      

      这样您就不必使用global 关键字来定义您的配置设置。

      【讨论】:

      • 和 jesse 一样,这种方法比globals好多
      • 哦,是吗?那么作为全局常量的密码呢?不用了。
      • 怎么样?如果存在代码执行漏洞,他们可以很容易地读取他的设置文件的内容,这不会影响安全性。
      【解决方案4】:

      这是一个范围界定问题。本质上,$settingssi_connect_db 函数不可见。

      应该做的是将$settings 作为参数传递给si_connect_db 函数。这可以改用global 来完成,但是使用全局变量是不好的做法,并且出于多种原因不赞成。可测试性、可维护性、可读性和一般的 OOP 设计(因为它破坏了封装)。

      function si_connect_db($settings) {
          // do stuff here
      }
      

      然后:

      include_once('functions.php');
      si_connect_db($settings);
      

      【讨论】:

        【解决方案5】:

        您应该在函数中包含您的设置文件。看在上帝的份上,避免使用全局范围。我也建议您这样做,因为如果您只需要连接,就会调用设置文件。使用我的方法,您也可以忘记每次需要连接时在每个应用程序的页面中包含设置文件。使用关键字 global 只是一种技巧。

        【讨论】:

        • 设置数组包含应尽早使用的私有信息,然后将其删除,使其不再可用。同样在这种情况下,用户应该在每次需要连接时调用设置文件并使设置数组全局化。我的回答肯定有什么问题?你完全讨厌的人写的事实的一部分?
        • 您的回答中没有证据的陈述是错误的。 “避免使用全局范围”是一个声明,“看在上帝的份上”不是程序员网站上可接受的证明。至于仇恨部分,我不知道你在说什么。
        • 谷歌搜索“全球”作为 PHP 相关的关键字,你会发现这是一个非常有争议的话题。有人问,在未来的 PHP 版本中是否会弃用 global 的使用。其他人认为他们没有任何邪恶。我个人讨厌他们,所以我只是说我会避开他们。尽管看起来如此,但这并不是全局关键字的相关问题。我认为我的方法会删除全局问题并提供更有效的设计逻辑。你有什么建议?
        • 另外,如果这句话是我投反对票的原因,那么我开始明白为什么你投了这么多反对票。考虑它的全球实体中的答案,不要专注于独立的陈述。它出什么问题了?我真的很好奇,也因为我自己很确定我会使用我的方法,这是一个向如此值得信赖的用户学习的好机会,同时也学到了“我也可能是错的”如此艰难的一课。跨度>
        • // 只是为了让@Col。弹片得到通知。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-19
        • 1970-01-01
        • 1970-01-01
        • 2018-06-08
        • 2013-05-16
        • 2023-03-05
        相关资源
        最近更新 更多