我有一个大型功能,我希望只在需要时加载。所以我假设使用include是要走的路。但我需要几个支持函数 - 只在go_do_it()中使用。
如果它们在包含的文件中,我会收到重新声明错误。见例A
如果我将支持函数放在include_once中,它可以正常工作,参见例B。
如果我使用include_once作为func_1代码,则第二次调用失败。
我很困惑为什么include_once导致函数在第二次调用时失败,它似乎第二次没有“看到”代码,但如果嵌套函数存在,它确实“看到”它们。
示例A:
<?php
/* main.php */
go_do_it();
go_do_it();
function go_do_it(){
include 'func_1.php';
}
?>
<?php
/* func_1.php */
echo '<br>Doing it';
nested_func()
function nested_func(){
echo ' in nest';
}
?>
例B:
<?php
/* main.php */
go_do_it();
go_do_it();
function go_do_it(){
include_once 'func_2.php';
include 'func_1.php';
}
?>
<?php
/* func_1.php */
echo '<br> - doing it';
nested_func();
?>
<?php
/* func_2.php */
function nested_func(){
echo ' in nest';
}
?>
答案 0 :(得分:19)
在函数中使用include()
的问题是:
include 'file1.php';
function include2() {
include 'file2.php';
}
file1.php
将具有全球范围。 file2.php
的范围是函数include2
的本地范围。
现在所有函数的范围都是全局的,但变量不是。我对include_once
的混乱并不感到惊讶。如果你真的想这样 - 老实说我不会 - 你可能需要借用一个旧的C / C ++预处理器技巧:
if (!defined(FILE1_PHP)) {
define(FILE1_PHP, true);
// code here
}
如果您想采用延迟加载的方式(顺便说一下,可能会出现操作码缓存问题),请使用自动加载。
答案 1 :(得分:15)
我有一个大型功能,我希望只在需要时加载。所以我假设使用include是要走的路。
您的基本假设是错误的。这种优化会适得其反;即使你的函数长达数百行,将它隐藏在PHP的解析器中也没有明显的好处。 PHP解析文件的成本可以忽略不计;真正的明显的速度增益来自于找到更好的算法或更好的方式来与您的数据库交谈。
那就是说,你应该在包含的文件中包含函数定义。而不是将函数体移动到func_1.php
,而是将整个函数移动到文件中。然后,您可以require_once
在您需要的每个文件中包含该函数的文件,并确保它只包含一次,无论您尝试包含它多少次。
一个例子:
function test() {
}
require_once('file1.php');
include('table_of_contents.php');
test();
答案 2 :(得分:1)
嗨,我解决了问题
//connect.php
$connect ="OK";
和
include "connect.php";
show($connect);
function show($connect){
echo $connect;
}