require_once函数内部

时间:2016-08-25 19:17:44

标签: php security

进行自我锻炼和训练我正在从头开始构建自己的CMS。本练习的一部分是启用自定义html,css模板

安全方面,如果我在函数内部使用require_once打开PHP模板文件来保护外部变量(如数据库处理程序等)会不会更好?

或者我应该完全不同于此?

1 个答案:

答案 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()变体。但是同样的问题仍然存在 - 当函数退出时,包含文件中定义的任何变量都会被销毁。这意味着像数据库连接这样的东西也会被破坏和清理 - 这使得无法在函数调用之间保持事务处理。