9

私は、メソッドに静的にアクセスする必要がある場合、インスタンス化する必要がない場合にのみ、クラスを抽象化する必要があると解釈しています。本当?

4

2 に答える 2

6

PHP はクラスに静的識別子を持たないため、クラスがインスタンス化されないようにするには他のメソッドが必要です。

抽象クラスを定義することで、クラスがインスタンス化されるのを防ぐことができます。これは安価な方法ですが、それは抽象クラスの目的ではありません。

他の方法には、コンストラクターをプライベートに定義することが含まれます

private function __construct() {}

または、インスタンス化できない理由についてより意味のあるメッセージを伝えたい場合は、コンストラクターで例外をスローします。

function __construct() { throw new Exception('This is a static class'); }

クラスをサブクラス化したくない場合は、クラス final を宣言します。

final class foo { }

または、奇妙なケースでは、それをサブクラス化できるようにしたいが、その子のインスタンス化を許可せずに、コンストラクターを final と宣言します。(とてつもない状況ですが、完全を期すために)

final private function __construct() {}
于 2009-10-07T20:56:32.863 に答える
3

質問に少し自信がありません。静的メソッドは、抽象クラスとはまったく異なります。通常、クラスをインスタンス化したくない場合は抽象クラスを作成しますが、サブクラスはインスタンス化する必要があります。抽象クラスを使用すると、部分的に実装されたクラスを作成するのに非常に役立ちます。このクラスでは、サブクラスが残りのメソッドを埋めてクラスを完全に実装します。

クラスの使用を防ぎたい場合は、静的メソッドでいっぱいのクラスを抽象として宣言できますが、一般に、クラスを抽象化すると、クラスを拡張するクラスを見つけることができるはずです。静的メソッドでいっぱいのクラスがある場合、誰もそれをサブクラス化しないため、抽象としてラベル付けしません。一般的に混乱を招きます。抽象クラスではなく、静的クラスと呼びたいと思います。

于 2009-10-07T20:51:02.360 に答える