1

私のプロジェクトには、多くの静的メソッドとクラス メソッドを持つ特定のクラスが 1 つあります (これは意図的なものであり、この場合、多くの小さなクラスではなく 1 つの大きなクラスを使用する方が理にかなっています)。

メソッドは、PSR-1 準拠のmethodNameの代わりにmethod_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);
}

ここで質問ですが、これはあまりにも醜いですか?上記の利点にもかかわらず、これを避けるべきですか?

4

1 に答える 1

1

いくつかの理由から、私はこのようにはしません:

  1. マジック関数 ( __call()__callStatic()__get()、...) は遅い、本当に遅い、ここに示されている
  2. ナビゲーション: クラスはメソッドを提供しdo_somethingますが、コードは を呼び出しますObject::doSomething()。これは、単に Ctrl+F でdoSomething. 同じことが IDE とコード補完にも当てはまります。
  3. なぜ移行するのですか?内部の非公開プロジェクトのメソッド名を、他のプロジェクトとの相互運用性のために定義された命名法にゆっくりと移行するよりも、もっと重要なことがあると思います。誤解しないでほしいのですが、PSR がナンセンスだとは言いません。絶対に必要でない限り、古いコードを強制的に準拠させる必要はないと思います。(この場合、この特定のクラスが、プロジェクト全体でそれに準拠していない唯一のクラスであることを意味します)

したがって、基本的には私のアドバイスです。このクラスを PSR-1 に本当に移行する必要がある場合は、一度に移行するか、そのままにしておいてください。ただし、命名スキームに準拠するためだけに魔法の関数を導入しないでください。

于 2013-01-15T22:53:24.183 に答える