代码之家  ›  专栏  ›  技术社区  ›  Déjà vu

试图理解PHP解析器/函数背后的逻辑

  •  0
  • Déjà vu  · 技术社区  · 3 年前

    b.php 文件

    <?php 
       function ff() { echo "B"; }
    

    还有这个 a.php 文件

    <?php 
    
    if ( true ) {
      include ("b.php");
      ff();
      exit;
    }
    
    function ff() { echo "A"; }
    

    php a.php 给予

    PHP Fatal error:  Cannot redeclare ff()
    

    嗯,好的。那如果我再跑呢 php a.php 用这个 密码

    <?php 
    
    if ( true ) {
      include ("b.php");
      ff();
      exit;
    }
    else {
      function ff() { echo "A"; }
    }
    

    B 正如所料。

    在第一种情况下,PHP读取并解析整个文件。意思是,在 虽然 exit 保证在运行时我们不会到达第二个 ff() .

    然而,在第二种情况下,它在

    编译器的行为似乎因函数是否为顶级而有所不同。。。虽然

    PHP中的所有函数和类都具有全局作用域

    doc )

    现在,如何将其转化为一个非基于意见的问题:)
    因此,两种选择似乎都是重命名 ff ffa ffb ,或添加一个长的 else { ... } . 或者改变整个结构。。。

    0 回复  |  直到 3 年前