PHP嵌套类工作......有点?

时间:2010-04-09 14:53:31

标签: php nested-class

所以,如果你尝试做这样的嵌套类:

//nestedtest.php

class nestedTest{
    function test(){
         class E extends Exception{}
         throw new E;
    }
}

您将收到错误Fatal error: Class declarations may not be nested in [...]

但是如果你在一个单独的文件中有一个类,那么:

//nestedtest2.php

class nestedTest2{
    function test(){
         include('e.php');
         throw new E;
    }
}

//e.php
class E Extends Exception{}

那么,为什么第二种hacky方式可行呢,但非黑客的做法不起作用?

3 个答案:

答案 0 :(得分:18)

从手册(http://php.net/manual/en/function.include.php):

  

当包含文件时,代码就是它   包含继承变量范围   包含的行   发生。任何可用的变量   调用文件中的那一行将是   在被调用文件中可用,来自   那一点。但是,所有   中定义的函数和类   包含文件具有全局范围。

答案 1 :(得分:1)

第二种方法不是嵌套类。您只需将两个声明放在一个文件中,这与您的第一个示例不同。在PHP中,您可以在一个文件中具有多个类声明,这是组织决策而非要求。

答案 2 :(得分:1)

没有充分的理由在方法中定义类。第二种方式“工作”只是因为它没有抛出错误 - 该类仍然存在于与所有其他已定义类相同的范围/命名空间中。所以,在这种情况下,你实际上并没有“嵌套”一个类。

顺便说一下,它工作的原因是因为一个类只是一个定义 - 定义一个类没有执行。因此,只要包含文件(e.php),就会对其进行解析,然后其类可用于当前的执行上下文。只有代码的可执行部分(即throw new E;)才真正属于调用者的范围。