6

私は、「parent :: _construct」に類似しているが、クラス自体を呼び出すクラスのコンストラクターを呼び出す方法を探していました(「self :: _construct」のようなものですが、機能しません)。なぜこれをするのですか?次のことを考慮してください(これは機能しません、ところで)...

class A {
  var $name;
  function __construct($name) {
    $this->name = $name;
  }
  function getClone($name) {
    $newObj = self::__construct($name);
    return $newObj;
  }
}

class B extends A {
}

実際の実装では、クラスBとクラスAを区別する他のプロパティがありますが、どちらにも「getClone」メソッドが必要です。クラスAのオブジェクトで呼び出された場合は、クラスAの別のオブジェクトを生成し、クラスBで呼び出された場合は、クラスBの別のオブジェクトを生成する必要があります。

もちろん、クラスBの "getClone"をオーバーライドし、クラス名をメソッドにハードコーディングすることでこれを行うこともできます(つまり、$ newObj = new B($ name))が、メソッドをコーディングするだけの方がはるかに便利です。一度、そのクラスが何であれ、それ自身のクラスのオブジェクトをインスタンス化するように指示します。

PHPでこれを実行できますか?

4

3 に答える 3

4

使用できます

 $clsName = get_class($this);
 return new $clsName();

ただし、nikoのソリューションも機能し、シングルトンパターンに役立ちますhttp://php.net/manual/en/language.oop5.static.php

php 5.3以降、staticキーワードの新機能を使用できるようになりました。

<?php

abstract class Singleton {

    protected static $_instance = NULL;

    /**
     * Prevent direct object creation
     */
    final private function  __construct() { }

    /**
     * Prevent object cloning
     */
    final private function  __clone() { }

    /**
     * Returns new or existing Singleton instance
     * @return Singleton
     */
    final public static function getInstance(){
        if( static::$_instance == null){
            static::$_instance = new static();
        }
        return static::$_instance;
    }
    
}
?>
于 2012-06-07T07:30:52.013 に答える
2

変数だけでなく、「self」や「static」などの特別なクラス関連のキーワードを使用して、新しいインスタンスを$newObj = new static($name);作成できます。-これにより、現在のクラスの新しいインスタンスが作成されます。

オブジェクトのクローン作成に組み込みのサポートを使用することを検討する必要$copy = clone $instance;があります。-マジックメソッド__clone()を指定することで、クラスのインスタンスでその演算子の動作を簡単に拡張できます。

class A {
  var $name;
  function __construct($name) {
    $this->name = $name;
  }
  function getClone($name) {
    $newObj = new static($name);
    return $newObj;
  }
}

class B extends A {
}

$tmp = new A('foo');
$a = $tmp->getClone('bar');
// $a instanceof A => true, $a instanceof B => false

$tmp = new B('foo');
$b = $tmp->getClone('bar');
// $b instanceof A => true, $b instanceof B => true
于 2012-06-07T06:35:34.437 に答える
0

組み込みのオブジェクト複製機能http://php.net/manual/en/language.oop5.cloning.phpを使用します。

しかし、コンストラクターの呼び出しに関する直接の質問については、init()関数を作成し、すべての__constructorコードをinit()に入れて、__constructorにinit()を呼び出させる必要があります。

于 2012-06-07T06:29:11.580 に答える