进行自我锻炼和训练我正在从头开始构建自己的CMS。本练习的一部分是启用自定义html,css模板
安全方面,如果我在函数内部使用require_once打开PHP模板文件来保护外部变量(如数据库处理程序等)会不会更好?
或者我应该完全不同于此?
答案 0 :(得分:0)
对require_once()
定义函数内变量的外部文件完全没用:
library.php:
<?php
if (!isset($counter)) {
$counter = 0;
}
$counter++; // increments every time this file is included
echo "Counter is $counter\n";
maincode.php:
<?php
function foo() {
require_once('library.php');
echo "foo() has counter = $counter\n";
}
function bar() {
require_once('library.php');
echo "bar() has counter = $counter\n";
}
foo();
bar();
结果:
$ php maincode.php
Counter is 1
foo() has counter = 1
PHP Notice: Undefined variable: counter in maincode.php on line 10
bar() has counter =
Include
d / require
d个文件会继承他们执行的上下文的范围。当你在函数中执行include
时,你会得到函数&#39 ; s上下文,变量变为&#34; local&#34;函数中的变量,并在函数调用返回时被销毁。
如果您执行_once()
变体,则您的文件在脚本的整个生命周期内只包含 ONCE ,从而导致上面的警告。 require_once()
中的bar()
来电没有做任何事情,因为该文件之前已经包含在foo()
来电中。所以它不包含在内,$counter
永远不会在bar()
中定义,现在没有任何作用。
当然,您可以简单地使用普通的include()
和require()
变体。但是同样的问题仍然存在 - 当函数退出时,包含文件中定义的任何变量都会被销毁。这意味着像数据库连接这样的东西也会被破坏和清理 - 这使得无法在函数调用之间保持事务处理。