PHP包含或要求类与原始书面类之间有何区别?

时间:2018-12-27 05:26:54

标签: php class oop

我在两个不同的文件上编写了两个类,例如文件classA.phpclassB.php,写在下面。

文件classA.php

 class a {
      public function __construct() {
           require_once('classB.php');
           $classB = new b();
      }
 }
 $classA = new a();

文件classB.php

 class b {
      public function __construct() {
          echo "Hello World!";
      }
 }

代码正常工作,并输出Hello World!但是,当我这样编写两个类时

 class a {
     public function __construct() {
         class b {
             public function __construct() {
                 echo "Hello World!";
             }
         }

         $classB = new b();
     }
 }
 $classA = new a();

显示错误

  

致命错误:类声明不能嵌套

哪个,我认为他们两个都应该做同一件事,昨天我发现了有关“任意地点”的信息,但我找不到正确答案。

我只想知道为什么两者都显示不同的结果?还是我不知道的关于includerequire的事情?

注意

我不是在问require()include()函数之间的区别

3 个答案:

答案 0 :(得分:2)

您的答案在the PHP documentation中:

  

包含文件时,文件包含的代码将继承包含该行的行的可变范围。从那时起,调用文件中该行上可用的任何变量将在被调用文件中可用。但是, 所包含文件中定义的所有函数和类都具有全局作用域

因此,与变量不同,require_once行的位置无关紧要:该类将始终位于全局范围内。

请注意,即使 includes 文件的名称空间也不会应用于 included 文件,因此,included函数和类不仅在全局范围内,而且在根名称空间。

答案 1 :(得分:0)

不允许您在另一个类的定义内定义一个类(除非使用我猜测的新匿名类功能)。

您可以在同一文件中定义多个类,但不能在另一类的代码中定义一个类。

如果使用Composer生成基于类图的自动加载,它将可以正确处理1个文件中定义的多个类。

答案 2 :(得分:-1)

class a {
    public function __construct() {
         require_once('classB.php');
         $classB = new b();
    }
}
$classA = new a();

不同
class a {
    public function __construct() {
        class b {
            public function __construct() {
                echo "Hello World!";
            }
        }

        $classB = new b();
    }
}

此willl也会起作用:

require_once('classB.php');
class a {
    public function __construct() {         
         $classB = new b();
    }
}
$classA = new a();

如果您使用include()require()。这意味着您可以使用它们的属性,例如变量,方法等。

示例:您有vars.php个文件

<?php
$color='red';
$car='BMW';
?>

然后您可以像这样在html中使用$color$car

<h1>Welcome to my home page!</h1>
  <?php include 'vars.php';
     echo "I have a $color $car.";
  ?>

class类似于属性。您可以通过创建实例来使用。 您将从source

了解更多信息