一尘不染

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

php

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

不,PHP中的“全局”与其他语言中的“全局”不同,尽管它不引入任何安全性问题,但会使其他人较难理解该代码。


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 ();

文件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>';
  [...]
}

我选择此方法有以下几个原因:

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

该代码运行良好。但是,在我发现的有关该主题的每篇文章中,我的函数中的“全局”调用都被称为不良实践,即使这些文章从未说明为什么?我以为所有的意思就是“使用父范围”。是否在向我的应用程序引入安全漏洞?有没有更好的方法?提前致谢。


阅读 245

收藏
2020-05-29

共1个答案

一尘不染

我认为避免这种情况的主要原因是它隐藏了依赖项。

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

随着代码库的复杂性增加,这种潜伏的依赖关系将使您的代码易碎且难以推理。

2020-05-29