PHP优先级函数声明

时间:2017-04-12 08:59:55

标签: php function

我对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已定义”
我做了补充测试:

  • 在第一次测试中:在包含之前放置函数toto()不会改变结果。
  • 在主文件中创建两次函数toto()创建致命错误


有人可以解释我这究竟是如何工作的? 感谢您的阅读

2 个答案:

答案 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*/ }来阻止它。
  • php在包含下一个文件之前完成文件的完整,意味着将声明php中的所有函数,然后包含。因此,如果第一行包含声明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中声明)