【问题标题】:Can I use traits in this way?我可以以这种方式使用特征吗?
【发布时间】:2017-01-17 16:11:50
【问题描述】:

首先我要说明的是,我知道 OOP 的原理,并且知道类、方法、属性等术语的含义。

有时我需要创建可在全局范围内访问的函数并在它们之间共享数据。例如,我在项目中创建了基于 WordPress 概念的挂钩机制。

在 WordPress 中有 $wp_hooks 变量放置在全局范围内,并且有 add_action()、do_action()、add_filter()、apply_filter() 函数。每个函数都通过“global”关键字导入 $wp_hooks var。

在我的项目中,我创建了只有静态方法和属性的类。简单例子:

<?php
class Hooks
{
    static private $_actions = [];
    static private $_filters = [];

    static public function addAction() { /* code... */ }
    static public function addFilter() { /* code... */ }
    static public function removeAction() { /* code... */ }
    static public function removeFilter() { /* code... */ }
    static public function runAction() { /* code... */ }
    static public function applyFilter() { /* code... */ }
}

我知道不应以这种方式使用类。有单例模式,但我不喜欢它,也不想在我的项目中使用它。

最近我偶然了解到,我可以使用与类相同的特征,只使用静态方法。在 PHP 中,可以在特征中调用公共静态方法。

类和特征具有相同的语法和相似的能力(都可以包含函数和变量)。但是trait只是容器,没有特殊含义,当类有特殊含义时,idea——类是现实中某些对象组的抽象类(例如Person类或Product类)。

这是我的问题。你认为当我在只是容器而不是真实类的类中将“class”更改为“trait”时我会犯错吗?

(对不起,我的英语错误。;>)

【问题讨论】:

  • 请不要将 WordPress 用作与软件架构/设计相关的任何示例。 ;)
  • 我故意使用了这个比较。 ;-) 我知道 WordPress 代码是设计糟糕的代码的一个例子。而且我认为使用方法制作类/特征比在全局范围内使用变量更好。

标签: php


【解决方案1】:

您不应该以这种方式使用 Traits - 它们更适合包含在其他类中 - 例如 Ruby 中的混合。但是就像在 Ruby 中一样,mix-ins 是作为模块实现的,模块本身可以是地址和引用它们的函数,所以 PHP 中的 trait 可以被寻址并引用它们的函数:

trait Test {
    public function foo() {
        return 4;
    }
 }

 Test::foo(); // returns => 4

对函数集合使用特征可能是“更好的风格”,而且它肯定会比一个空类中的静态方法集合看起来更漂亮,但这些都不是正确的事情(tm)。

【讨论】:

  • 是的,如果有人在他们声称“这是唯一的方法”的地步,总会有另一种更清洁的方法!
  • 非常感谢您的回复。在某些情况下,程序员找不到一个好的解决方案。 ;)
猜你喜欢
  • 1970-01-01
  • 2011-02-24
  • 2021-07-18
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多