当前位置: 首页 > 面试题库 >

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

柳修平
2023-03-14
问题内容

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

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

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


问题答案:

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

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

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



 类似资料:
  • 我有一个问题,关于什么是正确的做法,使用SwingU实用程序的调用稍后方法。 所以首先,我想确认我理解正确。 据我所知,对GUI的更改必须在EDT上完成,因为Swing组件不是线程安全的。invokeLater方法将Runnable作为参数,该Runnable中包含的任何内容都将在EDT上运行。因此,对Swing组件的任何调用都被放入一种队列中,在EDT上一次执行一个。 有了这些,我的问题是:使用

  • 我听到一些人说,即使在使用获得种子之后,使用也是很糟糕的。为什么会这样?我想知道事情是怎么发生的...抱歉,我又问了一个问题..但是,有什么办法可以替代这一点呢?

  • 问题内容: 在Java中,为什么从构造函数中调用方法被认为是不好的做法?如果该方法计算量大,是否特别糟糕? 问题答案: 首先,通常在构造函数中调用方法没有问题。这些问题特别涉及调用构造函数的类的可重写方法以及将对象的引用传递给其他对象的方法(包括构造函数)的特殊情况。 避免重载方法和“泄漏” 的原因可能很复杂,但它们基本上都与防止使用未完全初始化的对象有关。 避免调用可覆盖的方法 避免在构造函数中

  • 问题内容: 为什么每个人都告诉我编写这样的代码是一种不好的做法? 我省略花括号的最大论据是,有时花括号可能是花括号的两倍。例如,以下代码为C#中的标签绘制发光效果。 您还可以获得链接usings在一起的额外好处,而不必缩进一百万次。 花括号的最常见参数涉及维护编程,以及在原始if语句及其预期结果之间插入代码会引起的问题: 问题: 想要使用该语言提供的更紧凑的语法是错误的吗?设计这些语言的人很聪明,

  • 问题内容: 我有一个类的以下代码,它工作正常: 但是,我认为在该方法中实现OnClickListener是一种不好的做法。为什么会有这种不好的做法,还有什么更好的选择? 问题答案: 最好在ViewHolder中处理单击逻辑的原因是,它允许更明确的单击侦听器。如Commonsware书中所述: 很久以来,ListView行中的可单击小部件(如RatingBar)一直与行本身的单击事件发生冲突。获取可

  • 问题内容: 我问了一个一般性的Spring问题:自动播发Spring Bean,并让多个人回答说应尽可能避免调用Spring 。这是为什么? 我还应该如何访问配置了Spring创建的Bean? 我在非Web应用程序中使用Spring,并计划按照LiorH的描述访问共享对象。 修正案 我接受下面的答案,但这是Martin Fowler的另一种选择,他讨论了依赖注入与使用(本质上与调用相同)的优点。