1

我对 PHP 不太熟悉,正在寻找以下问题的最佳解决方案:

  • 我有一个 PHP 数组,其中包含有关我的脚本的重要信息

我需要在我的脚本中经常重复使用它。

$my_settings = array('width'=>'300', 'height'=>'200', ...);
  • 我将其存储在 MySQL 数据库中。

  • PHP 脚本每次运行时都需要从 MySQL 获取该数组,以便知道如何组合视图。

(数组最终会变得相当大......也许几百行......)

在我的脚本开头只获取和定义这个数组一次的最佳实践是什么,所以我可以一直通过其他函数等重用它......?

是通过全局定义吗?

global $my_settings;
$my_settings = get_my_settings_from_db();

function returnSetting($key='') {
 global $my_settings;
 return $my_settings[$key];

}

或者这是个坏主意?

最有效的方法是什么?

谢谢!

4

5 回答 5

4

而不是使用global(这是一件坏事),您应该注入变量(或者甚至更好地将您需要的部分注入需要它的函数中):

$my_settings = get_my_settings_from_db();

function returnSetting($settings, $key='') {
     return $settings[$key];
}

returnSetting($my_settings, $key);

或者也许更好地创建一个设置类:

class Settings
{
    protected $settings;

    public function __construct($settings)
    {
        $this->settings = $settings;
    }

    public function getSetting($key)
    {
        return $this->settings[$key];
    }
}

// you only create one instance per request, so you would do this in for example your bootstrap file
$settings = new Settings($my_settings);

假设您有一个需要一些设置的类,您可以执行以下操作:

class Foo
{
    protected $settings;

    public function __construct($settings)
    {
        $this->settings = $settings;
    {

    public function bar()
    {
        // do something which requires a setting
        echo $this->settings->getSetting('dimensions');
    }
}

$settings = new Settings($my_settings);
$foo = new Foo($settings);
$foo->bar();

这样做时,您将使您的代码具有更好的可测试性和可维护性。

请注意,这只是我用一只手拿着啤酒写的东西,它未经测试,但你应该明白这一点。:-)

于 2012-07-31T15:21:00.150 回答
0

环球真好!<- 如果今天是 2002 年 7 月,我会这么说

但在 2012 年全球必须被所有忍者开发者杀死。

尝试为此使用静态变量:

class DataCollector{
    static $my_settings = array('width'=>'300', 'height'=>'200');
}

//You could use the values at ANY place or function
echo DataCollector::$my_settings['width'];

另请阅读 OOP 基础知识。

于 2012-07-31T15:18:19.520 回答
0

您不需要像这样的第一个全局变量:

$my_settings = get_my_settings_from_db();

function returnSetting($key='') {
 global $my_settings;
 return $my_settings[$key];

}
于 2012-07-31T15:16:44.870 回答
-1

使用 $GLOBALS['my_settings']

$GLOBAL 是一个 php 超级全局变量,它可以用来代替 'global' 关键字来访问全局范围内的变量,即可以从 php 脚本中的任何位置访问的变量,即使是在函数或方法中。

$my_settings = array('width'=>'300', 'height'=>'200', ...);
function blablabla() {
  $b = $GLOBALS['my_settings'] ;
  echo $b ;
}
于 2017-10-05T09:06:12.557 回答
-2
function getSettings($id, $type) {
if(!$id == 0) {
$sql = "SELECT * FROM 'database' WHERE 'id' = '".$id."'";
$result = mysql_query($sql);

if(mysql_num_rows($result) == 0) {
while($row = mysql_fetch_assoc($result)) {
if($type == "setting1") {
        return $row['setting1'];
    } elseif($type == "setting2") {
        return $row['setting2'];
    } elseif($type == "setting3") {
        return $row['setting3'];
    } elseif($type == "setting4") {
        return $row['setting4'];
    } else {
        return "Wrong Input";
        }
} } else { return "Not Initialized";}
else { return "No $id input"; }}}

存储登录$_SESSION并调用getSetting($_SESSION['id'], "setting1")

于 2012-07-31T15:32:59.897 回答