3

コンストラクターのパラメーターをいくつでも取るクラスをインスタンス化したいと思います。

コンストラクターで 2 つの引数を取るクラス Man があるとします。

class Man
{
    protected $name;
    protected $age;

    public function __construct($name, $age)
    {
        $this->name = $name;
        $this->age = $age;
    }
}

それから私はパラメータを持っています:

$params = array()
$params['name'] = 'Jack';
$params['age'] = 55;

そして、これは私がクラスをインスタンス化する方法です:

$jack = new Man($params['name'], $params['age']);

今私が達成したいのは、params 配列は任意のサイズ、2、3、4、任意のサイズにすることができ、インスタンス化するクラスは同じ数のパラメーターを持つことです。

だから私を悩ませている唯一のことは、どうすれば変数を自動的に作成できるのでしょうか? 抽出関数がありますが、変数の数を返します:(

私はこれが必要です:

$jack = new Man($name, $age);

ただし、これは自動的に作成される必要があります。スクリプトは params 配列のみを認識し、すべての配列値を変数としてプッシュする必要があります。

最も近いものはこれです:

$jack = new Man(extract($params));

しかし、抽出関数は数値を返すため、配列から変数を作成し、それらをクラス コンストラクターに渡す必要があります。

編集:

クラスを変更することはできません。私の唯一の目標は、そのクラスを構築し、コンストラクターで期待される変数を渡すことです。したがって、私はクラス Im の構築に対して何の力も持っていません。私の目標は、そのクラスをインスタンス化することだけであり、コンストラクターにパラメーターを与えることです。これらのパラメーターは $params 配列に格納されますが、クラスはそれを変数として必要とします。私が達成しようとしていることをより簡単に把握できることを願っています。

ありがとう

4

6 に答える 6

1

配列をコンストラクターに渡します。

$jack = new Man($params);

次に、コンストラクターでパラメーターを処理します。

class Man
{
  public $Age;

  public function __construct( array $params )
  {
     foreach( $params as $key => $value ) {
       if( property_exists( $this, $key ) {
         $this->$key = $value;
       }
     }
  }
}
于 2012-09-02T19:35:35.000 に答える
1

はい、extractは変数の数を返しますが、変数も作成します。配列を入力として受け取り、クラス内からextractを呼び出すように、クラスを作成する必要があります。これにより、配列の各要素のラベルとして設定された名前を使用して変数が作成されます。

- 編集 -

質問への変更を見た後、私はより正確な答えを修正しました。

- 例 -

$params = array();  
$params['name'] = 'Jack';  
$params['age'] = 55;  

$jack = createMan($params);

//Function designed to extract correct parameters from $params

function createMan($params){

    extract($params);

    if(isset($name) && isset($age)){
        return new man($name, $age);
    }else{
        //What ever error logging and return null
        return null;
    }
}
于 2012-09-02T19:35:50.277 に答える
1

次の 2 つのいずれかを行うことができます。

  1. パラメータの配列を渡します。

    public function __construct(array $params) {}
    
  2. 関数内で使用func_get_args()して、すべての引数を連想配列の形式で取得します。

最初の方法は、含まれる「魔法」が少ないため、好ましい方法です。

未知の引数セットで関数を呼び出すには、引数が配列の形式である場合に を使用できますcall_user_func_array()

于 2012-09-02T19:29:42.730 に答える
0

私が必要としたのはこれでした:

ReflectionClass::newInstanceArgs

したがって、私の問題の解決策は次のとおりです。

$reflection = new \ReflectionClass($class); 
return $reflection->newInstanceArgs($params);

$params は params の配列で、$class は Im が構築しているクラスの名前です。

コメントありがとうございます!

于 2012-09-02T20:35:09.303 に答える
-1

これは役立つかもしれません:

class man{
   public function __construct($params){
      foreach($params as $key=>$value){
       $this->$key=$value;
      }
   }
}

このようにして、配列キーが変数として割り当てられます。

于 2012-09-02T19:36:41.913 に答える
-1

$obj->{$keyname}配列を反復処理し、構文を使用してクラスのプロパティを設定します。

public function __construct($params) {
    foreach($params as $key => $value) {
        $this->$key = $value;
    }
}
于 2012-09-02T19:30:59.350 に答える