PHP PSR-1通过__call和__callStatic,这太难看了吗?

时间:2012-08-14 01:46:50

标签: php

我的项目中有一个特定的类,它有很多静态和类方法(这是故意的,在这种情况下,更有意义的是,使用一个大类而不是许多小类)。

这些方法是使用下划线的情况定义的,例如 method_name ,而不是符合PSR-1的 methodName ,我们正在将一堆内容转换为PSR-1。

现在,我们可以使用类似这些方法(如下所示)来允许使用其中一个(method_name和methodName)。优点是我们没有冒险引入新的错误,并且使用它的所有当前代码仍然有效,我们可以慢慢迁移它们。

<?php

// enable PSR-1 for class methods
public static function __callStatic($name, $args) {
    $toLower = function($c) { return '_'.strtolower($c[1]); };
    $underscoreCased = preg_replace_callback('/([A-Z])/', $toLower, $name);
    return forward_static_call_array(['ClassName', $underscoreCased], $args);
}

// enable PSR-1 for instance metods
public function __call($name, $args) {
    $toLower = function($c) { return '_'.strtolower($c[1]); };
    $underscoreCased = preg_replace_callback('/([A-Z])/', $toLower, $name);
    return call_user_func_array([$this, $underscoreCased], $args);
}

现在的问题是,这太丑了吗?尽管有上述好处,我们应该避免这样做吗?

1 个答案:

答案 0 :(得分:1)

我不会这样做有几个原因:

  1. 魔术功能(__call()__callStatic()__get(),...)很慢,非常非常慢,shown here
  2. 导航:该类提供方法do_something,但您的代码调用Object::doSomething()。这是我检查实现的障碍,因为我不能简单地按Ctrl + F查看doSomething。 IDE和代码完成也是如此。
  3. 为什么要迁移?我想你有更重要的事情要做,而不是将内部私有项目中的方法名称慢慢迁移到与其他项目互操作性定义的命名法。不要误解我,我不会说,PSR是无意义的,我只是认为旧代码不必被强制遵守,除非它是绝对必要的。 (在这种情况下意味着,这个特定的类是唯一一个在整个项目中遵守它的类)
  4. 所以,基本上我的建议是:如果你真的需要将这个类迁移到PSR-1,那么要么一次性完成,要么让它成为。但是,不要仅仅为了符合命名方案而引入魔术函数。