所以,如果你尝试做这样的嵌套类:
//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方式可行呢,但非黑客的做法不起作用?
答案 0 :(得分:18)
从手册(http://php.net/manual/en/function.include.php):
当包含文件时,代码就是它 包含继承变量范围 包含的行 发生。任何可用的变量 调用文件中的那一行将是 在被调用文件中可用,来自 那一点。但是,所有 中定义的函数和类 包含文件具有全局范围。
答案 1 :(得分:1)
第二种方法不是嵌套类。您只需将两个声明放在一个文件中,这与您的第一个示例不同。在PHP中,您可以在一个文件中具有多个类声明,这是组织决策而非要求。
答案 2 :(得分:1)
没有充分的理由在方法中定义类。第二种方式“工作”只是因为它没有抛出错误 - 该类仍然存在于与所有其他已定义类相同的范围/命名空间中。所以,在这种情况下,你实际上并没有“嵌套”一个类。
顺便说一下,它工作的原因是因为一个类只是一个定义 - 定义一个类没有执行。因此,只要包含文件(e.php),就会对其进行解析,然后其类可用于当前的执行上下文。只有代码的可执行部分(即throw new E;
)才真正属于调用者的范围。