1

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

这些方法是使用下划线大小写来定义的,例如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);
}

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

4

1 回答 1

1

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

  1. 魔术函数 ( __call(), __callStatic(), __get(), ...) 很慢,真的,真的很慢,显示在这里
  2. 导航:该类提供了一个方法do_something,但您的代码调用了Object::doSomething(). 这是我检查实现的一个障碍,因为我不能简单地 Ctrl+F for doSomething. IDE 和代码完成也是如此。
  3. 为什么要迁移?我想您有比将内部私有项目中的方法名称缓慢迁移到为与其他项目的互操作性而定义的命名法更重要的事情要做。不要误会我的意思,我不会说 PSR 是胡说八道,我只是认为除非绝对必要,否则不必强迫旧代码遵守。(在这种情况下,这意味着这个特定的类是您整个项目中唯一遵守它的类)

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

于 2013-01-15T22:53:24.183 回答