【问题标题】:PHP: When to use Traits and when to use static methods?PHP:何时使用 Traits 以及何时使用静态方法?
【发布时间】:2014-06-04 01:40:09
【问题描述】:

我的 PHP 应用程序通常使用类进行命名空间。这些类中的方法被定义为静态的。

既然 PHP 已经引入了 Traits,我正在努力思考何时使用它们。我看到了一些使用特征的示例,但我认为这可以通过静态类方法轻松实现。

这里列出了一个使用记录器的非常详尽的示例:Traits in PHP – any real world examples/best practices?

但是,如果您还可以使用静态 Logger::log(),为什么还要使用 Trait?我现在唯一能想到的就是轻松访问 $this。 我现在面临的另一个例子是用户存在的功能。 trait 呢,还是静态方法呢?

有人能解释一下吗?

【问题讨论】:

  • 在代码库恕我直言,这两个都是废话。
  • @PeeHaa 请详细说明?
  • 由于紧密耦合,两者都使您难以对代码进行单元测试。以及维护/调试它,因为某种神奇的“外部”代码被“导入”到类中。
  • 特征主要用于减少代码重复。如果一堆类都具有相同的方法,但没有逻辑连接,因此将它们放在相同的层次结构中并继承该方法实际上是不可能的,那么您可以实现该方法一次并通过特征在所有这些类中使用它。 “特质与静态”是一个荒谬的问题,因为它不是一个非此即彼的事情。另见How Not To Kill Your Testability Using Statics
  • 谢谢大家。我现在对此有了更好的感觉。 @deceze,那个链接很棒,谢谢,改变了我对编写静态函数的看法。

标签: php methods static traits


【解决方案1】:

特征可以访问对象的私有成员。

【讨论】:

    【解决方案2】:

    在阅读了有关该问题的 cmets 后,我的答案是:

    Traits 允许扩展类而不是类层次结构的一部分。不需要像 class Book extends Loggable 这样的东西,因为 Book 本身不是 Loggable,我们只想要 Loggable 功能。 Loggable 中的功能可以填充到一个 trait 中,因此能够使用 Book 中的 Loggable 方法,就好像您是从它扩展而来一样。

    在类(或命名空间函数)中使用 trait 比使用静态方法的优势在于 trait 可以访问整个类范围,也可以访问私有成员。

    使用静态函数而不是特征的缺点是类之间的紧密耦合(依赖性),这会损害可重用性并可能损害单元测试(例如在使用模拟服务时)。依赖项应该在运行时注入,这确实增加了实例化类/方法的工作量,但在整个应用程序上提供了更好的灵活性。这对我来说是一个新的见解。

    【讨论】:

      【解决方案3】:

      我只将特征用于简单的辅助方法 [one-liners](字符串正则表达式验证、字符串规范化器、原始数字生成器),我在几个类中经常需要这些方法。

      当没有特征时,我使用公共静态方法 - 有了特征,也可以将它们定义为普通的私有方法。

      或者您可以使用特征来定义基本的虚拟函数,并结合具有接口的类来确保每个方法都存在。

      trait 的优点是您可以在多个类中使用相同的方法,并且对于小的更改,您不必在所有类中重写相同的方法。特质只是节省时间。 ;)

      顺便说一句.. spl_autoload_register 也可以处理特征文件的加载。 ;)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多