Php 在函数内部需要_一次
为了自我锻炼和训练,我正在从头开始建立自己的CMS。本练习的一部分是启用自定义html、css模板 就安全性而言,如果在函数内部打开带有require_once的PHP模板文件,以保护数据库处理程序等外部变量,是否会更好Php 在函数内部需要_一次,php,security,Php,Security,为了自我锻炼和训练,我正在从头开始建立自己的CMS。本练习的一部分是启用自定义html、css模板 就安全性而言,如果在函数内部打开带有require_once的PHP模板文件,以保护数据库处理程序等外部变量,是否会更好 或者我应该让它与此完全不同吗?如果需要一个定义函数中变量的外部文件,那么它将毫无用处: library.php: <?php if (!isset($counter)) { $counter = 0; } $counter++; // increments ev
或者我应该让它与此完全不同吗?如果
需要一个定义函数中变量的外部文件,那么它将毫无用处:
library.php:
<?php
if (!isset($counter)) {
$counter = 0;
}
$counter++; // increments every time this file is included
echo "Counter is $counter\n";
Include
d/require
d文件继承它们在其中执行的上下文的范围。当您在函数中执行include
操作时,您将获得函数的上下文,变量将成为函数中的“局部”变量,并在函数调用返回时被销毁
如果您执行\u once()
变体,则在脚本的整个生命周期内,您的文件实际上只包含一次,从而导致上述警告。require\u once()
调用bar()
没有做任何事情,因为该文件先前已包含在foo()
调用中。所以它不包括在内,$counter
从未在bar()
中定义过,现在什么都不起作用
当然,您可以简单地使用普通的include()
和require()
变体。但是同样的问题仍然存在——当函数退出时,包含文件中定义的任何变量都会被销毁。这意味着像数据库连接这样的事情也将被破坏和清理——这使得在函数调用之间不可能保持事务打开。我不明白require\u once
与函数有什么关系?如果在函数内部使用require\u once,它“似乎”只有在该函数中定义的非的变量才能工作一次。这与变量的作用域有关,并且不受require\u once
的约束。知道了这一点,我觉得自己聪明多了。我的目标是在函数中包含包含的文件,这非常好。相反地,你提到的这样做是不好的。谢谢你的回答
<?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 =