【问题标题】:When creating my own classes in PHP should I extend stdClass?在 PHP 中创建自己的类时,我应该扩展 stdClass 吗?
【发布时间】:2014-05-27 12:41:55
【问题描述】:

虽然 PHP 中的类不需要显式扩展 stdClass,但我想知道这样做是否有某种最佳实践或好处。

我应该在声明类时扩展stdClass 吗?

有关参考,请参阅What is stdClass in PHP?PHP: Objects, Converting to object

【问题讨论】:

  • 不。没有必要。
  • 也许在某个时候 PHP 会为 stdclass 添加一些有用的“实用程序”方法,而您的派生对象也会突然拥有这些实用程序,但这不太可能。
  • @MarcB 我个人认为那会很好。例如,一些伪运算符重载(isEqualisGreater 等)但要有效实现,类型需要自动派生 stdClass

标签: php extend stdclass


【解决方案1】:

扩展 stdClass 有一个有趣的用途:($object instanceof stdClass) 将返回 true,并且比 is_object($object) 快 3 倍。我们说的是 1 秒的差异,但不幸的是,除非您在整个项目中制定严格的政策,否则它很容易变得不连贯,因此比帮助更令人困惑。事实上,我很失望地得知 PHP 类默认不扩展 stdClass。对我来说是有意义的。

【讨论】:

    【解决方案2】:

    StdClass 为空,因此扩展它没有任何好处。

    你只是在你的__CLASS__˙中浪费extend

    php --rc StdClass
    Class [ <internal:Core> class stdClass ] {
    
      - Constants [0] {
      }
    
      - Static properties [0] {
      }
    
      - Static methods [0] {
      }
    
      - Properties [0] {
      }
    
      - Methods [0] {
      }
    }
    

    扩展 stdClass 的唯一原因是满足针对此类的类型提示 - 但是,永远不应使用此类类型提示,因为这是一个有争议的问题。

    【讨论】:

    • 从 stdClass 扩展有一个好处。它只会让您的类具有开箱即用的动态属性。另一种实现相同目的的方法是实现 ArrayAccess 和 Countable 接口。
    • @ArmanP。几乎所有 PHP 对象都可以拥有动态属性,而无需做任何特别的事情。防止这种情况发生的唯一方法是,如果对象实现了__get__set,并且您在那里抛出异常。
    【解决方案3】:

    没有           

    【讨论】:

    • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
    • @BhavikAmbani:实际上,它为这个问题提供了一个非常清晰、简洁和正确的答案。没有。
    • 我认为你最好在评论部分提及这一点
    • 既然您似乎对此感到困惑,@BhavikAmbani,请让我解释一下。 我是在说明一个观点。该死,我什至说 CW 没有从这个非问题的非答案中得到任何代表。
    • @BhavikAmbani:仅仅因为答案很短,并不意味着它需要成为评论。自己阅读您的自动评论。他是在“批评”还是“要求作者澄清”?不,他没有。请先了解答案和评论之间的区别,然后再将您的自动 cmets 粘贴到合法答案上。
    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 2016-07-15
    • 2011-12-11
    • 1970-01-01
    相关资源
    最近更新 更多