编辑:在上面的链接中回答的问题。
不,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>'; [...] }
我选择此方法有以下几个原因:
该代码运行良好。但是,在我发现的有关该主题的每篇文章中,我的函数中的“全局”调用都被称为不良实践,即使这些文章从未说明为什么?我以为所有的意思就是“使用父范围”。是否在向我的应用程序引入安全漏洞?有没有更好的方法?提前致谢。
我认为避免这种情况的主要原因是它隐藏了依赖项。
你的功能get_data和run_html做以任何方式,他们共享数据不做广告,但他们做的,在一个大的方式。而且没有办法(缺少阅读代码)知道run_html如果get_data没有被调用将是无用的。
get_data
run_html
随着代码库的复杂性增加,这种潜伏的依赖关系将使您的代码易碎且难以推理。