为什么在函数内使用"全局"引用被认为是不好的做法?

4 php security encapsulation scope function

可能重复:
PHP中的全局变量是否被视为不良做法?如果是这样,为什么?
全球职能

编辑:问题在上面的链接中回答.

不,php中的"global"与其他语言中的global不同,虽然它没有引入任何安全问题,但它可以使代码对其他人的理解变得不那么容易理解.


OP:

项目摘要 - 我正在编写一个Web CMS来熟悉PHP/MySQL.为了分解代码,我有一个基本层/模块的概念:

数据
- MySQL表
- PHP变量

功能
- SQL - 获取/设置/等
- 前端 - 显示页面
- 后端 - 经理

演示文稿
- HTML模板
- 页面内容
- CSS样式表

目标很普遍.使用MySQL来保存站点设置和页面内容,使用php来获取/操作正在提供的页面的内容数据,然后插入到html模板中并回显到浏览器.来自C#等OO语言,我遇到的第一个问题是使用包含和函数时的可变范围问题.

从一开始我就编写了仅用于函数的php文件,并将其包含在其他具有现有变量数组定义的文件中.例如,暂时忽略数据层,一个简单的页面通常可能如下所示:

文件1(页面)

$DATA_PAGE = Array
(
  'temp'  = null,
  'title' = null,
  [...]
);

include 'functions.php';

get_data ( 'page.php' );

[...]

run_html ();
Run Code Online (Sandbox Code Playgroud)

文件2(功能)

function get_data ( $page_name )
{
  global $DATA_PAGE;

  $DATA_PAGE [ 'temp'  ] = 'template';
  $DATA_PAGE [ 'title' ] = 'test page';
  [...]
}

function run_html ()
{
  global $DATA_PAGE;

  echo '<html>';
  echo '<head>';
  echo '<title>' . $DATA_PAGE [ 'title' ] . '</title>';
  [...]
}
Run Code Online (Sandbox Code Playgroud)

我选择这种方法有几个原因:

  • sql fetch之后这些数组中的数据可能会在任何地方使用,包括页面内容
  • 我不想拥有十几个函数参数,或者传递整个数组

代码运行得很好.但是在我发现的每一篇文章中,我的函数中的"全局"调用被称为不良实践,即使这些文章从未说明为什么?我认为这意味着"使用父范围".我在我的应用程序中引入了一个安全漏洞?有更好的方法吗?提前致谢.

gro*_*gel 8

我认为避免这种情况的一个主要原因是它隐藏了依赖关系.

你的功能get_datarun_html不以任何方式,他们共享数据做广告,但他们做的,在一个大的方式.并且没有办法(没有阅读代码)知道run_html如果get_data没有被调用将是无用的.

随着代码库复杂性的增加,这种潜在的依赖性将使您的代码变得脆弱且难以推理.