我在所有页面上共享PHP代码库,对于每个HTTP请求,我都会动态require
"/configs/$site/config.php"
文件。该文件如下所示:
<?php
$SiteConfiguration = [
'site_title => 'Wiki for Developers',
'mysql_host' => 'localhost',
'mysql_db' => 'wiki-devs',
'articles_per_page' => 10,
/* ... etc ... */
];
?>
我面临的问题是我无法从函数中完全访问此变量。
例如:
function DisplayArticles() {
echo "Displaying ".$SiteConfiguration['articles_per_page'];
}
它将只打印Displaying
而不是Displaying 10
.
如何解决此问题并让我的$SiteConfiguration随处可访问?我应该使用class
吗?这里的最佳实践是什么?
put
global $SiteConfiguration;
在您的函数中,您可以在 http://www.php.net/manual/en/language.variables.scope.php 中找到更多信息
由于您要求提供最佳实践信息:(最简单的形式)
class MySite{
public static function getConfig(){
return array(
'site_title => 'Wiki for Developers',
'mysql_host' => 'localhost',
'mysql_db' => 'wiki-devs',
'articles_per_page' => 10,
/* ... etc ... */
);
}
}
然后在您的代码中,您可以使用
$config = MySite::getConfig();
并使用它。(显然有一个比我的网站更好、更具描述性的名称;))
优势:
- 如果设置正确并且可以找到您的类,您的 PHP 类自动加载器将自动为您加载它,这意味着不必担心您是否传递了变量,无需担心函数参数放置,并且不会用不必要的参数污染您的函数,这些参数无助于描述它的作用。
- 您可以精确地控制对此数据的访问,并且可以做到这一点,即使您自己的函数也不会意外更改此数据,即使在调用也需要访问它的其他函数时也是如此。
全局变量,它击败了通过参数传递,因为它更干净,您可以控制对它的所有形式的访问。您可以通过特定的 getter/setter 选项将某些属性设置为只读/可写,记录它被访问的次数以及您能想到的任何其他内容。
这是配置类可以正常工作的另一种情况:
class Config {
private static $site_config = array( 'h' => 'Hello', 'w' => 'World');
public static function get( $key) {
return isset( self::$site_config[$key]) ? self::$site_config[$key] : null;
}
}
echo Config::get( 'h') . ' ' . Config::get( 'w');
这将输出:Hello World
使用全局关键字
function DisplayArticles() {
global $SiteConfiguration;
echo "Displaying ".$SiteConfiguration['articles_per_page'];
}
编辑
您应该尽量避免使用全局变量。
更好的做法是在参数中传递数组
function DisplayArticles( array $config ) {
echo "Displaying ".$config['articles_per_page'];
}
$SiteConfiguration = array( 'site_title' => 'Wiki for Developers',
'mysql_host' => 'localhost',
'mysql_db' => 'wiki-devs',
'articles_per_page' => 10,
/* ... etc ... */
);
DisplayArticles( $SiteConfiguration );
你可以尝试这样的事情。
您的"站点配置.php"文件:
<?php
$SiteConfiguration = [
'site_title' => 'Wiki for Developers',
'mysql_host' => 'localhost',
'mysql_db' => 'wiki-devs',
'articles_per_page' => 10
];
return $SiteConfiguration;
?>
而这个功能:
function getConfigVar($var) {
static $config = array();
if( empty($config) ) {
$config = require("siteConfiguration.php");
}
return array_key_exists($var, $config) ? $config[$var] : null;
}
还可以修改此函数以处理多个配置。