Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php “为什么使用”被认为是不好的做法;“全球”;函数内部的引用?_Php_Security_Function_Scope_Encapsulation - Fatal编程技术网

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

Php “为什么使用”被认为是不好的做法;“全球”;函数内部的引用?,php,security,function,scope,encapsulation,Php,Security,Function,Scope,Encapsulation,可能重复: 编辑:以上链接中回答的问题 不,php中的“global”与其他语言中的global不同,虽然它不会带来任何安全问题,但它会使代码不易被其他人理解 作品: 项目摘要-我正在写一个web CMS,用PHP/MySQL打湿我的脚。为了分解代码,我有以下基本层/模块的概念: 数据 -MySQL表 -PHP变量 功能 -SQL-Get/Set/etc -前端-显示页面 -后端管理器 演示文稿 -HTML模板 -页面内容 -CSS样式表 这个目标很普遍。使用MySQL保存站点设置和页面内

可能重复:

编辑:以上链接中回答的问题

不,php中的“global”与其他语言中的global不同,虽然它不会带来任何安全问题,但它会使代码不易被其他人理解


作品:

项目摘要-我正在写一个web CMS,用PHP/MySQL打湿我的脚。为了分解代码,我有以下基本层/模块的概念:

数据
-MySQL表
-PHP变量

功能
-SQL-Get/Set/etc
-前端-显示页面
-后端管理器

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

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

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

文件1(第页)

文件2(功能)

函数获取数据($page\u name)
{
全球$DATA_页面;
$DATA_页面['temp']='template';
$DATA_页面['title']=“测试页面”;
[...]
}
函数run_html()
{
全球$DATA_页面;
回声';
回声';
回显'.$DATA_页['title'].';
[...]
}
我选择这种方法有几个原因:

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

代码运行得很好。但在我找到的关于这个主题的每一篇文章中,我函数中的“全局”调用都被称为坏习惯,尽管这些文章从未说明原因?我认为这意味着“使用父范围”。我想在我的应用程序中引入一个安全漏洞?有更好的方法吗?提前感谢。

因为全局变量可以由过程修改,而代码的其他部分不知道它会产生意外的结果

您应该始终尽可能在本地保持变量的作用域——这不仅有助于您进行调试,而且还可以使您的代码更易于阅读、返回和修改


如果您希望在多个函数之间共享数据,那么可以考虑为您的数据创建一个类,然后定义对封装在对象中的数据进行操作的方法。(面向对象编程)

使用不同范围的变量是不好的做法,因为这会降低代码的可移植性。换句话说,如果我想在其他地方使用
get_data()
函数,在另一个项目中,我必须先定义
$data_页面
变量,然后才能使用它

好吧,这是唯一应该避免的原因——但这是一个很好的理由

我会通过引用来代替

function get_data (&$data_page, $page_name )
{
  $data_page['temp'] = 'template';
  $data_page['title'] = 'test page';
  [...]
}
get_data($DATA_PAGE);

出于许多原因,例如:

  • 难以支持带有全局变量的代码。您不知道全局变量在哪里会影响您的逻辑,也不控制对它们的访问

  • 安全性——如果你有一个复杂的系统(特别是插件),有人可以用全局变量破坏所有系统


全局变量中的设置很好,但正如tkone所说,将可修改的数据放入全局变量可能会产生意外的结果


也就是说,我不同意应该不惜一切代价避免全局变量的观点——只要试着将它们包装到一个单例设置类中即可。

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

您的函数
get_data
run_html
不会以任何方式宣传它们共享数据,但它们确实以很大的方式共享数据。如果没有调用
get\u data
,就没有办法(除了阅读代码之外)知道
run\u html
将是无用的


随着代码库复杂性的增加,这种潜在的依赖性将使代码变得脆弱,难以解释。

您知道php支持OOP,对吗?我确信你在c#中没有使用裸露的全局变量,那么为什么现在就开始呢?但它实际上不是一个全局变量,它只是从被调用的文件中可见。有些代码知道如何使用数组而不知道数据是如何获取的,这不是封装背后的基本思想吗,有类还是没有类?在PHP中使用
global
关键字声明变量的瞬间,它就变成了一个全局变量:“通过在函数中声明$a和$b全局,对任一变量的所有引用都将引用全局版本。函数可以操纵的全局变量数量没有限制。”[好的一点,在项目发展之后,这可能会成为一个问题数组只是保存从查询中获取的数据,这是我的第一个想法,不必反复查询同一个表,看起来不管我喜欢与否,我都必须返回到对象..这在PHP5中被弃用了吗?我喜欢这个ideaNo,通过引用传递未弃用。但是,您必须在定义函数时声明它是引用,而不是在调用函数时声明它-因此请严格按照上面的方法执行。我知道这是一个旧答案,只是为了从以下位置更新它:注意:函数调用上没有引用符号-仅在函数定义上。仅函数定义就足以通过引用正确传递参数。从PHP5.3.0开始,您将收到一条警告,指出在使用&in foo(&$a);)时,“调用时间通过引用传递”是不推荐的。从PHP5.4.0开始,调用时间通过引用传递
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>';
  [...]
}
function get_data (&$data_page, $page_name )
{
  $data_page['temp'] = 'template';
  $data_page['title'] = 'test page';
  [...]
}
get_data($DATA_PAGE);