8

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

//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 的做法有效,但 non-hacky 的做法却行不通呢?

4

3 回答 3

18

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

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

于 2010-04-09T14:58:03.577 回答
1

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

于 2010-04-09T14:54:57.990 回答
1

没有充分的理由在方法中定义一个类。第二种方式“有效”仅在它不引发错误的意义上 - 该类仍然存在于与所有其他定义的类相同的范围/命名空间中。因此,在这种情况下,您实际上并没有“嵌套”一个类。

顺便说一句,它起作用的原因是因为一个类仅仅是一个定义——定义一个类不涉及执行。因此,一旦您包含该文件(e.php),它就会被解析,然后它的类可用于当前执行上下文。只有代码的可执行部分(即throw new E;)实际上属于调用者的范围。

于 2010-04-09T14:58:42.847 回答