我对PHP中声明函数的方式有疑问。
档案“functions.php”=> functions toto(){ return "1"; }
主文件
include("functions.php") functions toto(){ return "main"; } echo toto();
档案“functions.php”=> functions toto(){ return "1"; }
档案“functions2.php”=> functions toto(){ return "2"; }
主文件
include("functions.php") include("functions2.php") echo toto();
第一次测试工作和回声“主”
第二个测试不起作用=>致命错误“函数toto已定义”
我做了补充测试:
有人可以解释我这究竟是如何工作的?
感谢您的阅读
答案 0 :(得分:1)
来自include
系列的PHP语句不会在包含器的上下文中复制粘贴包含文件的内容。包含在运行时发生。
在第一个示例中,在编译期间创建了主文件中定义的函数toto()
。然后,在执行时,读取并解析functions.php
文件。它会生成错误,因为它会尝试定义已定义的函数toto()
。
在包含functions.php
期间,第二个例子也是如此。此外,如果在主脚本中声明函数toto()
两次,则会出现相同的错误。
无论哪种方式,都无法重新声明PHP函数和常量。 来自documentation的快速报价:
PHP不支持函数重载,也不可能取消定义或重新定义以前声明的函数。
您可以使用function_exists()
PHP函数检查函数是否已定义(以避免再次定义):
function toto() { return 1; }
if (! function_exists('toto')) {
function toto() { return 2; }
}
答案 1 :(得分:0)
指向主题
toto()
否则您获得Fatal error: Cannot redeclare
您可以使用if(!function_exists('toto')){ /*declaration*/ }
来阻止它。toto()
的文件,但下一行也声明toto()
。包含中的声明抛出Fatal error
。 if(1){ }
中换行,因此请知道Fatal Error
不是来自包含的文件。测试用例:
//file1.php
<?php
function toto(){ echo __FILE__; }
//file2.php
<?php
include 'file1.php';
function toto(){ echo __FILE__; }
toto();
呼叫: php file2.php
结果: 致命错误:无法重新声明toto()(之前在file2.php中声明)
//file1.php
<?php
function toto(){ echo __FILE__; }
//file2.php
<?php
include 'file1.php';
if(1){
function toto(){ echo __FILE__; }
}
toto();
呼叫: php file2.php
结果: 致命错误:无法重新声明toto()(之前在file1.php中声明)