5

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

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;
  }

}

私の質問は、上記のように$ thisを使用できますか?

それ以外の:

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

私は書くことができます:

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

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

ソリューションの更新:

これらは両方とも基本クラスで機能します。

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。のように実行する必要があります。

4

3 に答える 3

5

簡単、staticキーワードを使用

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

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

于 2012-05-07T05:26:48.187 に答える
1

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();
于 2012-05-07T05:12:05.937 に答える
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-テスト

テスト開始-テスト

于 2012-05-07T05:07:18.937 に答える