PHP PSR-1 通过 __call 和 __callStatic,这是不是太丑了


PHP PSR-1 via __call and __callStatic, is this too ugly?

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

这些方法是使用下划线大小写(如method_name)而不是符合PSR-1的方法Name定义的,我们正在将一堆东西转换为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. 魔术函数(__call()__callStatic()__get(),...)很慢,非常非常慢,如图所示
  2. 导航:该类提供了一个方法do_something但您的代码调用Object::doSomething() 。这是我检查实现的障碍,因为我不能简单地按 Ctrl+F 进行doSomething。对于 IDE 和代码完成也是如此。
  3. 为什么要迁移?我想您有更重要的事情要做,而不是将内部私有项目中的方法名称缓慢迁移到为与其他项目互操作性而定义的命名法。不要误会我的意思,我不会说,PSR 是无稽之谈,我只是认为除非绝对必要,否则不必强迫旧代码遵守。(在这种情况下,这意味着,这个特定的类是整个项目中唯一不遵守它的类

所以,基本上我的建议是:如果你真的需要将这个类迁移到PSR-1,要么一次全部完成,要么让它去做。但不要仅仅为了遵守命名方案而引入魔术函数。