我可以用这种方式使用特征吗?

时间:2017-01-17 16:11:51

标签: php

首先我要注意,我知道OOP的原则,我知道什么是术语,方法,属性等等。

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

在WordPress中,$ wp_hooks变量放在全局范围内,并且有add_action(),do_action(),add_filter(),apply_filter()函数。每个函数都输入$ wp_hooks var by" global"关键字。

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

<?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中,可以在特征中调用公共静态方法。

类和特性具有相同的语法和相似的功能(两者都可以包含函数和变量)。但是特性只是容器,没有特殊意义,当类具有特殊含义时,想法 - 在实际中某些对象组的摘要中(例如Person类或Product类)。

这是我的问题。当我改变&#34; class&#34;你认为我会犯错吗?到&#34;特质&#34;在只是容器而不是真正的类的类中?

(抱歉我的英文错误。;&gt;)

1 个答案:

答案 0 :(得分:2)

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

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

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

可能是&#34;更好的风格&#34;对函数集合使用traits,它肯定比其他空类中的静态方法集更漂亮,但这些都不是 Right Thing(tm)