今日、受け入れられた答えは時代遅れです。
クラスの名前を変更することは悪い習慣です。新しいバージョンにアップグレードするたびに、何をどこで名前を変更するかを覚えておく必要があります。場合によっては (リフレクションや複雑な依存構造を使用する場合など)、根本的なリファクタリングなしでは不可能な場合があります。そして、これは回避したい偶発的な複雑さです。そのため、名前空間が PHP に導入されました。Java、C++、または C# は を使用せず__construct
、名前付きコンストラクターを使用し、問題はありません。
PHP 5.3.3 以降、名前空間クラス名の最後の要素と同じ名前のメソッドは、コンストラクターとして扱われなくなりました。この変更は、名前空間のないクラスには影響しません。
例
namespace Foo;
class Test {
var $a = 3;
function Test($a) {
$this->a = $a;
}
function getA() {
return $this->a;
}
}
$test = new Test(4);
echo $test->getA(); // 3, Test is not a constructor, just ordinary function
名前付きコンストラクターは廃止されていないことに注意してください (現在の PHP 5.5)。ただし、クラスが名前空間で使用されないことを予測することはできないため、優先する __construct
必要があります。
上記の悪い慣行についての説明(Dennis 向け)
コードのどこかでReflectionClass::getName()を使用できます。クラスの名前を変更するときは、Reflection を使用した場所を覚えておいて、getName()
結果がアプリ内で一貫しているかどうかを確認する必要があります。特定のことを覚える必要があるほど、何かを忘れる可能性が高くなり、アプリにバグが発生します。
親は、自分に依存する世界のすべてのクラスを制御することはできません。allow_url_includeが有効になっている場合、他の Web がサーバーのクラスを使用している可能性があり、一部のクラスの名前を変更するとクラッシュする可能性があります。上記のコンパイルされた言語ではさらに悪化します。ライブラリがコピーされ、他のコードにバンドルされる可能性があります。
クラスの名前を変更する理由はありません。
- クラス名が競合する場合は、名前空間を使用してください
- クラスの責任が変わる場合は、代わりに他のクラスを派生させます
名前空間の PHP クラスでは、とにかく同じ名前のメソッドを避ける必要があります。直観的に、クラスを作成したオブジェクトを生成する必要があります。それが何か他のことをするなら、なぜ同じ名前を付けるのですか? それはコンストラクタであり、それ以外のものではありません。主な問題は、そのようなメソッドの動作が名前空間の使用法に依存することです。
PHP の __construct コンストラクターには問題はありません。しかし、名前付きコンストラクターを変更するのは賢明なアイデアではありませんでした。