2011-07-06 7 views
6

プライベートコンストラクタを持つクラスをインスタンス化するにはどうすればよいですか?プライベートコンストラクタを持つクラスをインスタンス化する方法

独自のインスタンスを作成するためにクラス内の関数を使用したくないです。

例のクラスがある:あなたはインスタンスを作成するために、外部からアクセス可能な静的メソッドを使用するを持っているので、

class Test extends Test2 implements Test3 { 
    private function __construct() { 
    } 

    function doDisplay() { 
    } 

    function Docall() { 
    } 
} 
+0

ええと、なぜあなたはこのC++にタグを付けましたか? – BoltClock

+0

OOPはどのプログラミング言語でも特許を取得していないため、私はちょうど使用しました。 – Sahal

+2

異なる言語がOOPを異なる方法で実装し、OOPにSがない。 – BoltClock

答えて

5

コンストラクタがprivate(シラバスから)のクラスからオブジェクトをインスタンス化することはできません。

機能を使用する場合は、staticとし、それらを使用してニーズを満たす必要があります。関数がpublicであることを確認してください。 EXのために

:あなたはリフレクションを使用して、それをインスタンス化(PHP> = 5.4)

class Test { 

    private $a; 

    private function __construct($a) 
    { 
     $this->a = $a; 
    } 
} 

$class = new ReflectionClass(Test::class); 
$constructor = $class->getConstructor(); 
$constructor->setAccessible(true); 
$object = $class->newInstanceWithoutConstructor(); 
$constructor->invoke($object, 1); 

それは動作しますが、心に留めておくことができますhttp://codepad.org/VoYeyk8W

+1

私はクラスをインスタンス化していないと考えていますが、インスタンス化はできません。 –

+2

まさにここのポイントです。クラスをインスタンス化できませんが、あなたはまだ 'static'メソッドを呼び出すことができます。 –

6

あなたは、どこにもなく、クラス自体の中からプライベートコンストラクタを呼び出すことはできません。

また、Test2にプライベートでないコンストラクタがある場合は、Test::__construct()をプライベートにすることはできません。

+0

なぜ私はこれをやりたいのですが、私はいくつかの工場でのみオブジェクトを作成したかったからです。他の人が直接このクラスのオブジェクトを作成しないようにします。私はこれを扱うことができる他の方法はありますか? – Sahal

+0

さて、クラスはいつでもPHPでグローバルにアクセス可能です。ファクトリを引数として受け入れるパブリックコンストラクタを持つことができます。ファクトリを作成するファクトリオブジェクトでない場合は、例外をスローします。 – BoltClock

0

クラス内で(静的な)メソッドを使用してインスタンスを作成したくない場合、あなたの質問に対する答えは単純に次のようになります。

1

このクラスを設計した人は誰でも直接インスタンス化する必要はありません。あなたがしたいことはできません。おそらく元の著者はこれを行う良い理由がありました。おそらくメモリ管理だったのでしょうか、ライフサイクルを制御したい、またはスレッディングの問題を止めたかったのでしょうか?それはたくさんの理由があります。

唯一の明白な答えは、他の人のデザインに侵入しようとするのではなく、あなたが望むようにソースを書き直すことです。あるいは、あなたが好きでない部分を隠すこのクラスの周りにラッパーを作ることができるので、コードの残りの部分を知る必要はありません。

+0

メモリ管理とトレッドにどのように関連しているのか説明できますか? – Sahal

1

<?php 

class something 
{ 
    private function __construct() 
    { 
     echo "something"; 
    } 

    public static function display($msg) 
    { 
     echo $msg; 
    } 
} 

something::display("Testing..."); 

?> 

は、実施例を参照してください。これは、クラスが設計された使用法ではなく、予期せぬ副作用がある可能性があることを示しています。

+0

リフレクションの素晴らしいトリックです。この回答は受け入れられるべきです。 – user1636505

関連する問題