我对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];
}
或者这是个坏主意?
最有效的方法是什么?
谢谢!
与其使用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();
在这样做的时候,您将使代码更易于测试和维护。
请注意,这只是我用一只手拿着啤酒写的东西,它还没有经过测试,但你应该明白这个想法。:-)
您不需要像这样的第一个全局:
$my_settings = get_my_settings_from_db();
function returnSetting($key='') {
global $my_settings;
return $my_settings[$key];
}
全局很好<-如果今天是2002年7月,我会这么说
但在2012年,全球必须被所有的忍者开发者杀死。
尝试为此使用静态var:
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基础知识。
使用$GLOBALS['my_settings']
$GLOBAL是一个php超级全局变量,它可以代替"GLOBAL"关键字从全局范围访问变量,即可以从php脚本中的任何位置访问的变量,即使是在函数或方法中。
$my_settings = array('width'=>'300', 'height'=>'200', ...);
function blablabla() {
$b = $GLOBALS['my_settings'] ;
echo $b ;
}
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")
进行调用