- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个 config.php
包含在每个页面中。在配置中,我创建了一个类似于以下内容的数组:
$config = array();
$config['site_name'] = 'Site Name';
$config['base_path'] = '/home/docs/public_html/';
$config['libraries_path'] = $config['base_path'] . '/libraries';
//etc...
然后我有
function.php
,这也包含在几乎每个页面中,我必须使用
global $config
访问它 - 这就是我想要摆脱的!
$config
在我代码的其他部分不使用
global
?
global
在我的例子中?有人说这是一种不好的语气,有人说它不安全?
function conversion($Exec, $Param = array(), $Log = '') {
global $config;
$cmd = $config['phppath'] . ' ' . $config['base_path'] . '/' . $Exec;
foreach ($Param as $s)
{
$cmd .= ' ' . $s;
}
}
编辑2:
key
和
value
从数据库。我过度简化了分配
$config
的想法数组,这里是一个例子:
$sql = "SELECT * from settings";
$rsc = $db->Execute($sql);
if ( $rsc ) {
while(!$rsc->EOF) {
$field = $rsc->fields['setting_options'];
$config[$field] = $rsc->fields['setting_values'];
@$rsc->MoveNext();
}
}
编辑 3:
vars
来自 config 中设置的函数,而且很少,例如:
$db
,
$language
等等。
global
它真正改变了什么?
global
.我同意一切,但我不使用
global
在我的情况下,重新分配变量,这将导致,就像他说的,
<-- WTF!!
, ;)) 是的,同意,这太疯狂了。但是如果我只需要使用
global $db
从函数访问数据库在这种情况下问题出在哪里?在不使用
global
的情况下,您如何做到这一点? ?
define
但使用
vars
- 好吧,这在技术上是错误的。但是你的函数不依赖于任何东西——而是一个 var 的名称
$db
你能记住吗?全局需要使用
$db
,这里的依赖在哪里以及如何使用它?
最佳答案
点对点global
变量是它们非常紧密地耦合代码。您的整个代码库取决于 a) 变量名称 $config
b) 该变量的存在。如果您想重命名变量(无论出于何种原因),您必须在整个代码库中的任何地方都这样做。您也不能再使用任何依赖于变量的代码。
示例与 global
多变的:
require 'SomeClass.php';
$class = new SomeClass;
$class->doSomething();
SomeClass.php
中的类或一些代码隐式依赖于一个全局变量
$config
.尽管只是看类(class),但没有任何迹象表明这一点。要解决这个问题,你必须这样做:
$config = array(...);
require 'SomeClass.php';
$class = new SomeClass;
$class->doSomething();
$config
中设置正确的 key ,此代码可能仍会在某处失败。 .由于配置数组的哪些部分并不明显
SomeClass
需要或不需要,当它需要它们时,很难重新创建正确的环境以使其正确运行。如果您碰巧已经有一个变量
$config
,它也会产生冲突。用于其他任何你想使用的地方
SomeClass
.
require 'SomeClass.php';
$arbitraryConfigVariableName = array(...);
$class = new SomeClass($arbitraryConfigVariableName);
$class->doSomething();
require_once 'Database.php';
require_once 'ConfigManager.php';
require_once 'Log.php';
require_once 'Foo.php';
// establishes a database connection
$db = new Database('localhost', 'user', 'pass');
// loads the configuration from the database,
// the dependency on the database is explicit without `global`
$configManager = new ConfigManager;
$config = $configManager->loadConfigurationFromDatabase($db);
// creates a new logger which logs to the database,
// note that it reuses the same $db as earlier
$log = new Log($db);
// creates a new Foo instance with explicit configuration passed,
// which was loaded from the database (or anywhere else) earlier
$foo = new Foo($config);
// executes the conversion function, which has access to the configuration
// passed at instantiation time, and also the logger which we created earlier
$foo->conversion('foo', array('bar', 'baz'), $log);
global
.每个函数和类都获得以函数参数形式传递的所有必要数据。很明显,上述组件可以以任何其他组合插入在一起,或者依赖项可以很容易地替换为其他组件。例如,配置根本不需要来自数据库,或者记录器可以在没有
Foo::conversion
的情况下记录到文件而不是数据库。必须知道这些。
ConfigManager
的示例实现:
class ConfigManager {
public function loadConfigurationFromDatabase(Database $db) {
$result = $db->query('SELECT ...');
$config = array();
while ($row = $result->fetchRow()) {
$config[$row['name']] = $row['value'];
}
return $config;
}
}
loadConfigurationFromDatabase
的代码。来自该功能的任何特定实现。如果您只是使用全局
function loadConfigurationFromDatabase()
,你基本上又遇到了同样的问题:当你尝试调用它时需要定义该函数,如果你想用其他东西替换它,就会存在命名冲突。通过使用对象,代码的关键部分移到这里:
$config = $configManager->loadConfigurationFromDatabase($db);
$configManager
此处用于任何其他也具有方法的对象
loadConfigurationFromDatabase
.那就是“鸭子打字”。你不在乎究竟是什么
$configManager
就是,只要它有方法
loadConfigurationFromDatabase
.如果它走路像鸭子,叫起来像鸭子,那就是鸭子。或者更确切地说,如果它有
loadConfigurationFromDatabase
方法并返回一个有效的配置数组,它是某种 ConfigManager。您已将代码与一个特定变量
$config
分离,来自一个特定的
loadConfigurationFromDatabase
功能,甚至来自一个特定的
ConfigManager
.所有部分都可以从任何地方动态更改和换出、替换和加载,因为代码不依赖于任何一个特定的其他部分。
loadConfigurationFromDatabase
方法本身也不依赖于任何一个特定的数据库连接,只要它可以调用
query
在它上面并获取结果。
$db
传递给它的对象可能完全是假的,并且可以从 XML 文件或其他任何地方读取其数据,只要其接口(interface)的行为仍然相同。
关于php - 停止在 PHP 中使用 `global`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12445972/
我在 JavaScript 文件中运行 PHP,例如...... var = '';). 我需要使用 JavaScript 来扫描字符串中的 PHP 定界符(打开和关闭 PHP 的 )。 我已经知道使
我希望能够做这样的事情: php --determine-oldest-supported-php-version test.php 并得到这个输出: 7.2 也就是说,php 二进制检查 test.
我正在开发一个目前不使用任何框架的大型 php 站点。我的大问题是,随着时间的推移慢慢尝试将框架融入应用程序是否可取,例如在创建的新部件和更新的旧部件中? 比如所有的页面都是直接通过url服务的,有几
下面是我的源代码,我想在同一页面顶部的另一个 php 脚本中使用位于底部 php 脚本的变量 $r1。我需要一个简单的解决方案来解决这个问题。我想在代码中存在的更新查询中使用该变量。 $name)
我正在制作一个网站,根据不同的情况进行大量 PHP 重定向。就像这样...... header("Location: somesite.com/redirectedpage.php"); 为了安全起见
我有一个旧网站,我的 php 标签从 因为短标签已经显示出安全问题,并且在未来的版本中将不被支持。 关于php - 如何避免在 php 文件中写入
我有一个用 PHP 编写的配置文件,如下所示, 所以我想用PHP开发一个接口(interface),它可以编辑文件值,如$WEBPATH , $ACCOUNTPATH和 const值(value)观
我试图制作一个登录页面来学习基本的PHP,首先我希望我的独立PHP文件存储HTML文件的输入(带有表单),但是当我按下按钮时(触发POST到PHP脚本) )我一直收到令人不愉快的错误。 我已经搜索了S
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is the max key size for an array in PHP? 正如标题所说,我想知道
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我在 MySQL 数据库中有一个表,其中存储餐厅在每个工作日和时段提供的菜单。 表结构如下: i_type i_name i_cost i_day i_start i_
我有两页。 test1.php 和 test2.php。 我想做的就是在 test1.php 上点击提交,并将 test2.php 显示在 div 中。这实际上工作正常,但我需要向 test2.php
我得到了这个代码。我想通过textarea更新mysql。我在textarea中回显我的MySQL,但我不知道如何更新它,我应该把所有东西都放进去吗,因为_GET模式没有给我任何东西,我也尝试_GET
首先,我是 php 的新手,所以我仍在努力学习。我在 Wordpress 上创建了一个表单,我想将值插入一个表(data_test 表,我已经管理了),然后从 data_test 表中获取所有列(id
我有以下函数可以清理用户或网址的输入: function SanitizeString($var) { $var=stripslashes($var); $va
我有一个 html 页面,它使用 php 文件查询数据库,然后让用户登录,否则拒绝访问。我遇到的问题是它只是重定向到 php 文件的 url,并且从不对发生的事情提供反馈。这是我第一次使用 html、
我有一个页面充满了指向 pdf 的链接,我想跟踪哪些链接被单击。我以为我可以做如下的事情,但遇到了问题: query($sql); if($result){
我正在使用 从外部文本文件加载 HTML/PHP 代码 $f = fopen($filename, "r"); while ($line = fgets($f, 4096)) { print $l
我是一名优秀的程序员,十分优秀!