【问题标题】:What's the efficient way to create a safe variable scope in a PHP file that is beeing included?在包含的 PHP 文件中创建安全变量范围的有效方法是什么?
【发布时间】:2013-08-04 22:55:53
【问题描述】:

这是一个非常简单的设置示例:

包括/form.php

$secret_var = 'Mind blowing secret';
return '<form></form>';

page.php

echo include('includes/form.php'); // Notice the unusual way of including
echo $secret_var;

结果

<form></form>
Mind blowing secret

如你所见,我不会返回 $secret_var,但它仍然暴露在外!

为该 includes/form.php 中的所有变量创建范围的最有效方法是什么,以便 PHP 自动取消设置它们?

当然我知道我可以运行unset($secret_var);,但是有很多表单,每个变量都有很多变量,并且不同的开发人员会不断地更改它们。从长远来看,这种方法基本上意味着 100% 的机会出现错误。我需要以某种方式自动完成(如函数中的变量),但在这种情况下不使用命名函数(一个文件可能包含多次)。保持 page.php 内的代码不变也是最高优先级,因为这将意味着系统范围内的大量更改。

也许我可以使用匿名函数之类的?最好不要损害性能...

【问题讨论】:

  • 那么不要这样include ;-) 为什么这显然不是一个选项?
  • +1 to delnan - 我很困惑为什么一个正常的形式是禁忌!
  • 这样做是为了返回生成的 HTML,而不是直接回显它或在每个 form.php 中创建一个新变量。因为有时重用的表单首先与其他 HTML 合并,然后才回显。我希望我很清楚..

标签: php include scope


【解决方案1】:

代替

echo include('includes/form.php'); // Notice the unusual way of including
echo $secret_var;

使用

echo call_user_func(function(){
    // secret var's scope is only valid in this block...
    // while the return '<form></form>'; is... returned.
    include('includes/form.php');
});
echo $secret_var;

看看进展如何。

PS不要echo include。它的意思是echo bool;,而不是里面的return。

PPS而且你没有正确使用包含,因为它们的本意是......但我什至不会从那开始。 p>

【讨论】:

  • 是的!为了让 page.php 保持不变,我可以将 include/form.php 中的所有内容包装在 call_user_func() 中,瞧!有用!谢谢你。关于您的 PS:如果它不正确,为什么它会起作用?那么如何正确地回显呢?喜欢这个echo (include('includes/form.php')); 吗?关于 PPS:它有什么已知的缺点吗?还是不常见?
  • @Alph.Dev include() 是一个函数。文件中的内容被执行,但它本身返回一个bool 值。所以你不应该回应它。如果它在这里工作,那只是因为你使用包含的奇怪方式。将return 放在include 中并不是一个好主意。这是一种 99% 的保证方式,因为 include() 之后的代码将无法执行,因此以后很难跟踪问题。 returns 进入函数。 退货不包括在内。这是一个黑客,不是正确的方法:)
  • 对这个话题做了更多的研究。来自 PHP 手册 link “可以在包含的文件中执行 return 语句,以终止该文件中的处理并返回调用它的脚本。此外,还可以从包含的文件中返回值. 您可以像对待普通函数一样获取 include 调用的值。” 这听起来足够可靠。唯一的限制似乎是远程文件,但我们不会在这个项目中使用它们。
  • 这可能是一个较新的东西。 我是一只老狗,一旦我正确地学习了一个技巧,我就会坚持下去:) 我用它和requirereturn 破坏了 required 它的文件流。但我不这样做是因为函数存在正是出于这个原因。在 include 中声明一个或多个函数并使用它。就像它的意思一样。 在编程时你可以做很多骇人听闻的事情,但你不应该这样做。 --- 妈妈,我可以抽烟吗?是的,你可以,但你不能:)
  • 这可能是你没有写糟糕的包含,但你必须处理它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
相关资源
最近更新 更多