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 - Fatal编程技术网

Php 在函数内部需要_一次

Php 在函数内部需要_一次,php,security,Php,Security,为了自我锻炼和训练,我正在从头开始建立自己的CMS。本练习的一部分是启用自定义html、css模板 就安全性而言,如果在函数内部打开带有require_once的PHP模板文件,以保护数据库处理程序等外部变量,是否会更好 或者我应该让它与此完全不同吗?如果需要一个定义函数中变量的外部文件,那么它将毫无用处: library.php: <?php if (!isset($counter)) { $counter = 0; } $counter++; // increments ev

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

就安全性而言,如果在函数内部打开带有require_once的PHP模板文件,以保护数据库处理程序等外部变量,是否会更好


或者我应该让它与此完全不同吗?

如果
需要一个定义函数中变量的外部文件,那么它将毫无用处:

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 =