PHP可以在两个文件中嵌套类吗?

时间:2016-11-08 14:01:19

标签: php class

我知道php不能嵌套类,但是如果两个类都在两个文件中,它似乎可以:

MainClass.php:

<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL | E_STRICT);

class mainclass
{
  private $var;
  public function __construct()
  {
    require_once ('subclass.php');
    $subinstant = new subclass();
  }
}
$maininstant = new mainclass();

subclass.php

<?php
ini_set("display_errors", "On");
error_reporting(E_ALL | E_STRICT);
class subclass
{
  public function __construct()
  {
    $this->var="this-var\n";
    echo $this->var;
    $test="test in construct\n";
    echo $test;
    function testvar()
    {
      //$this->var = "this-var in fun\n";
      //echo $this->var;
      $funtest="test in fun\n";
      echo $funtest;
    }
    testvar();
  }
}

没有错误输出,结果如预期。我只是不理解require_once,它似乎会将代码包含在subclass.php中,那么与直接在同一位置直接写相比有什么区别?< / p>

还有什么,如何访问$var中的变量testvar()? (使用尽可能多的方法),谢谢!

2 个答案:

答案 0 :(得分:2)

require_once不包括当场其他类的代码。 requirerequire_onceincludeinclude_once的行为是唯一的:它“离开”当前对象并将所请求文件中的代码“合并”到全局范围

这意味着,你认为是这个

class mainclass
{
  private $var;
  public function __construct()
  {
    require_once ('subclass.php');
    $subinstant = new subclass();
  }
}

PHP解释器实际上看到了这一点(当你创建mainclass的实例时):

class mainclass
{
  private $var;
  public function __construct()
  {
    $subinstant = new subclass();
  }
}

class subclass
{
  public function __construct()
  {
    $this->var="this-var\n";
    echo $this->var;
    $test="test in construct\n";
    echo $test;
    function testvar()
    {
      //$this->var = "this-var in fun\n";
      //echo $this->var;
      $funtest="test in fun\n";
      echo $funtest;
    }
    testvar();
  }
}
$maininstant = new mainclass();

正如@Federkun在这篇文章的评论中指出的那样,它实际上写在docs

  

但是,包含文件中定义的所有函数和类都具有全局范围。

答案 1 :(得分:1)

是的,您可以在单个文件中定义任意数量的类,只需要提供不同的名称,因为所有类都在相同的范围内。您可以使用$ this-&gt; var访问$ var,但是您无法访问另一个类中某个类的私有变量,也无法使用对象访问。 因此,在您的代码中,您无法访问$ var