【问题标题】:Class definition inside a function: is there ever a use for it?函数内的类定义:它有没有用处?
【发布时间】:2015-11-21 15:24:32
【问题描述】:

看着 PHP documentation,他们说

任何有效代码都可能出现在函数内部,甚至是其他函数和类定义。

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

【问题讨论】:

  • 即使有一个用例,它仍然是一个非常非常糟糕的设计。放开手!
  • PHP 7 将支持匿名类,请参见此处stackoverflow.com/questions/9726396/…
  • @Alex Andrei,谢谢,这很有趣,可能也值得在答案中发布该信息。
  • @bg17aw 这实际上不是 OP 所要求的。匿名类仅存在于创建的上下文中,不能在其他任何地方引用,而正确的类定义可以从任何地方访问。 OP 问题的用例可能是类加载器。
  • @bub,你能在答案中扩展它吗?如果这确实是不好的做法,我肯定想知道这一点,尤其是为什么。

标签: php class oop


【解决方案1】:

除非并且直到该函数运行,否则不会解析函数内部的类定义。 if 语句中的任何类型的定义也是如此。 if 语句中的定义有一个用途:

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

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

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

【讨论】:

    【解决方案2】:

    查看任意类加载器(例如 Composer 的 ClassLoader::includeFile())我会说他们都会在一个方法中 require/include 请求的类,该方法实际上是在该方法中定义一个类。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多