函数内部的类定义:它是否有任何用途?


Class definition inside a function: is there ever a use for it?

看PHP文档,他们说

任何有效的代码都可以出现在函数中,甚至可以出现在其他函数和类定义中。

在函数内部有一个类定义的用例吗?我见过函数内部的函数定义,尤其是匿名函数,但是类呢?

函数中的类定义将不会被解析,除非该函数运行。这同样适用于if语句中的任何类型的定义。在if语句中可以使用定义:

if (!function_exists('foo')) {
    function foo ..
}

这对于向后兼容垫片等非常有用。将其扩展到函数内部也很有意义,为什么不想将您的shim代码封装到函数中呢?

除了有条件地声明类和函数之外,它没有任何实际用途。以这种方式声明的类和函数可以像任何其他类或函数一样全局访问,只是它们的声明延迟到函数被调用。还要注意,如果调用这样的函数两次(class Foo already defined),将触发一个错误,除非您采取了class_exists那样的预防措施。

看看任意的类加载器(例如Composer的ClassLoader::includeFile()),我想说它们都将在一个方法中require/include请求的类,有效地在该方法中定义一个类。

对于类方法来说,如果你想创建一个只是函数的类装入器,你现在可以这样做。还要注意,PHP中的第一个类加载器只能通过实现函数__autoload()来实现。