2012-05-07 15 views
4

は、私はこのようなクラスを持っている:

class someClass { 

    public static function getBy($method,$value) { 
    // returns collection of objects of this class based on search criteria 
    $return_array = array(); 
    $sql = // get some data "WHERE `$method` = '$value' 
    $result = mysql_query($sql); 
    while($row = mysql_fetch_assoc($result)) { 
     $new_obj = new $this($a,$b); 
     $return_array[] = $new_obj; 
    } 
    return $return_array; 
    } 

} 

私の質問です:私は上記の持っているように、$これを使用することができますか?

$new_obj = new $this($a,$b); 

私は書くことができます:代わりの

$new_obj = new someClass($a,$b); 

しかし、その後、私はクラスを拡張するとき、私はメソッドをオーバーライドする必要があります。最初のオプションが機能すれば、私はする必要はありません。ソリューションの

UPDATE:

基底クラスでこれらの作業の両方:

1)

$new_obj = new static($a,$b); 

2)

$this_class = get_class(); 
    $new_obj = new $this_class($a,$b); 

私はそれらを試していませんまだ子供のクラスでは、#2はそこで失敗すると思います。

また、これは動作しません:

$new_obj = new get_class()($a,$b); 

それはパースエラーになります。予期しない「(」 それは2のように、2つの段階で行わなければなりません)のように、まだ良く以上、または1.)。

+0

コードにセミコロンがありません。 $ return_array [] = $ new_obj; – yehuda

答えて

5

簡単に使用することができます

public static function buildMeANewOne($a, $b) { 
    return new static($a, $b); 
} 

http://php.net/manual/en/language.oop5.late-static-bindings.phpを参照してください。

+0

" return new self($ a、 $ b); " ? –

+1

@Buttle Butkus: 'self'は、で定義されているクラス静的メソッドを参照するため動作しません。Philが詳細を提供しました。 – zerkms

+0

そして、私はBryan Moylesが苦しんでいるように" get_class() "を使うと思います。同じ問題、そう? –

0

は(get_classを使用してみてください)、これはクラスが実行している場合、あなたは次のような出力が得られます

<? 
class Test { 
    public function getName() { 
     return get_class() . "\n"; 
    } 

    public function initiateClass() { 
     $class_name = get_class(); 

     return new $class_name(); 
    } 
} 

class Test2 extends Test {} 

$test = new Test(); 

echo "Test 1 - " . $test->getName(); 

$test2 = new Test2(); 

echo "Test 2 - " . $test2->getName(); 

$test_initiated = $test2->initiateClass(); 

echo "Test Initiated - " . $test_initiated->getName(); 

を継承している場合でも動作します。

テスト1 - テスト

テスト2 - 開始テスト

テスト - テスト

1

あなたはstaticキーワードを使用し、ReflectionClass::newInstance

http://ideone.com/THf45

class A 
{ 
    private $_a; 
    private $_b; 

    public function __construct($a = null, $b = null) 
    { 
     $this->_a = $a; 
     $this->_b = $b; 

     echo 'Constructed A instance with args: ' . $a . ', ' . $b . "\n"; 
    } 

    public function construct_from_this() 
    { 
     $ref = new ReflectionClass($this); 
     return $ref->newInstance('a_value', 'b_value'); 
    } 
} 

$foo = new A(); 
$result = $foo->construct_from_this(); 
+0

静的メソッドでは動作しません – Phil

+0

@Phil:ああ、神様は十分注意していませんでした:-S私にとって '$ this'は常に非静的メソッドを意味します:-S – zerkms

関連する問題