2011-02-26 101 views
0

的config.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(); 

我没有连接...我怎样才能做到这一点?

回答

3

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部分。

+0

谢谢,工作;) – Thew 2011-02-26 13:57:35

+0

不客气:-)玩得开心! – 2011-02-26 13:58:08

2

你应该让$settings为全局变量声明函数外

function si_connect_db(){ 
    global $settings; 

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

+1

绝对不行!全球是邪恶的! – Shoe 2011-02-26 14:12:35

+2

它的邪恶,但解决了这个问题 – delphist 2011-02-26 14:14:23

+0

它只是黑客的问题。看看我的答案。 – Shoe 2011-02-26 14:18:22

2

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

更好的使用define()例如为:

define(MYSQLHOST, 'localhost'); 

这种方式,而不是定义全局常量不必使用global关键字来定义你的配置设置。

+1

为什么这是downvoted? – 2011-02-26 13:59:24

+1

与jesse相同,这种方法比'globals'更好_ – xzyfer 2011-02-26 14:00:55

+0

哦是啊?密码和全球常量一样呢?不用了,谢谢。 – Shoe 2011-02-26 14:17:57

1

这是一个范围界定问题。本质上$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); 
0

您应该包括内部功能的设置文件。为了上帝的缘故避免使用全球范围。我建议你这也是因为设置文件被调用,如果你只需要连接。使用我的方法,您也可以在每次需要连接时忘记将设置文件包含在每个应用程序的页面中。使用关键字全球只是一个黑客。

+0

它肯定有什么问题吗? – 2011-02-26 14:20:40

+0

设置数组包含应该尽可能早地使用的私人信息,然后将其删除,以便它们不再可用。在这种情况下,用户应该调用设置文件,并在每次需要连接时将设置数组设置为全局。我的回答有什么错误?一个由你完全讨厌的人写下的事实的一部分? – Shoe 2011-02-26 14:24:27

+0

没有证据的陈述在你的答案中是错误的。 “避免使用全球范围”是一种陈述,“为了上帝的缘故”并不是程序员网站可以接受的证明。至于仇恨部分我不知道你在说什么。 – 2011-02-26 14:38:40

相关问题