2012-02-24 5 views
-1

:PHP 5.3で静的クラスメソッドから現在のクラスインスタンスを取得することはできますか?このような、このコードのように

class C{ 

    function static getInstance(){ 
    // here 
    } 

} 


$c = new c; 
print_r(C::getInstance()); // should be $c 

または少なくとも

print_r($c::getInstance()); // should be $c 
+0

ここでSingletonパターンをチェックしてください。 oop5.patterns.php – summea

+0

2番目の例は非常に愚かです。最初の例は役に立ちません。代わりにどの問題を解決したいかを明確に記述する必要があります。 – hakre

+1

あなたはCのインスタンスを増やすことができますが、どちらをお望みですか? – jgivoni

答えて

2

これは、シングルトンを作成するには、間違った方法だろうが、あなたはこれを行うことができます:

class C { 

    private static $instance; 

    public static function getInstance(){ 
    return self::$instance; 
    } 

    public function __construct() { 
    self::$instance = $this; 
    } 
} 

$c = new c; 
print_r(C::getInstance()); // should be $c 

を私はあなたが何をしようとしてわからないんだけど、これは道にありませんそれをやる。

更新:

Aはるかに優れたアプローチは、次の操作を実行するために、次のようになります。http://php.net/manual/en/language:

class C 
{ 
    private static $instance; 

    public static function getInstance() 
    { 
    if (!is_null(self::$instance)) return self::$instance; 
    self::$instance = new self; 
    return self::$instance; 
    } 

    private function __construct() 
    { 
    // Whatever 
    } 
} 

$c = new C; // This will not work since __construct() is private 
$c1 = C::getInstance(); 
$c2 = C::getInstance(); 

echo ($c1 == $c2 ? 'yes' : 'no'); // yes 
+0

downvotingありがとう。コメントを残すために気をつけますか? –

+0

これはまさに私がどのような目的のために考えているのか全く分かりませんが、 – jgivoni

+0

'C :: getInstance()'を呼び出す必要はなく、 '$ c'を直接使うことができます。 '$ c = new c;'と 'C :: getInstance()'の間にコードがある場合、あなたのコードは関数が '$ c'と同じオブジェクトを返すことを保証しません。答えは技術的に間違っています。 – hakre

1

を使用して、あなたがあなたのシングルトンのために欲しいものを行う必要があり__invoke()のようないくつかの魔法のメソッドを持っています。

もっとここで読む:http://br2.php.net/manual/en/language.oop5.magic.php#object.invoke

<?php 
class CallableClass 
{ 
    public function __invoke() 
    { 
     return this; 
    } 
} 
$obj = new CallableClass; 
var_dump($obj); 
3

うーん... なし、定義により、なし現在のクラスのインスタンスが存在しないため。メソッドgetInstance()はどこからでも呼び出すことができ、クラスCのインスタンスも存在する必要はありません。

関連する問題