1

jQuery と同様の方法で新しい PHP オブジェクトをインスタンス化する方法はありますか? オブジェクトを作成するときに可変数の引数を割り当てることについて話しています。たとえば、次のようなことができることを知っています。

...
//in my Class
__contruct($name, $height, $eye_colour, $car, $password) {
...
}

$p1 = new person("bob", "5'9", "Blue", "toyota", "password");

でも、そのうちのいくつかだけを設定したいのかもしれません。次のようなものです:

$p1 = new person({
    name: "bob",
    eyes: "blue"});

これは、jQuery やその他のフレームワークでの方法に沿ったものです。これはPHPに組み込まれていますか?それを行う方法はありますか?それとも避けるべき理由ですか?

4

4 に答える 4

4

これを行う最善の方法は、配列を使用することです。

class Sample
{
    private $first  = "default";
    private $second = "default";
    private $third  = "default";

    function __construct($params = array())
    {
         foreach($params as $key => $value)
         {
              if(isset($this->$key))
              {
                  $this->$key = $value; //Update
              }
         }
    }
}

そして、配列で構築します

$data = array(
     'first' => "hello"
     //Etc
);
$Object = new Sample($data);
于 2011-01-13T14:51:10.540 に答える
2
class foo {
   function __construct($args) {
       foreach($args as $k => $v) $this->$k = $v;
       echo $this->name;
    }
 }

 new foo(array(
    'name' => 'John'
 ));

私が考えることができる最も近い。

もっと凝ったものにしたい、そして特定のキーを許可したいだけなら、あなたは使うことができます__set()(php 5でのみ)

var $allowedKeys = array('name', 'age', 'hobby');
public function __set($k, $v) {
   if(in_array($k, $this->allowedKeys)) {
      $this->$k = $v;
   }
}
于 2011-01-13T14:52:00.820 に答える
0

PHPは1つの引数のみが渡されるので、getargsは機能しません。

public __contruct($options) {
    $options = json_decode( $options );
    ....
    // list of properties with ternary operator to set default values if not in $options
    ....
}

json_decode()を見てください

于 2011-01-13T14:53:50.223 に答える
-1

私が考えることができる最も近いものは、とを使用することarray()ですextract()

...
//in your Class
__contruct($options = array()) {

    // default values
    $password = 'password';
    $name = 'Untitled 1';
    $eyes = '#353433';

    // extract the options
    extract ($options);

    // stuff
    ...

}

そしてそれを作成するとき。

$p1 = new person(array(
    'name' => "bob",
    'eyes' => "blue"
));
于 2011-01-13T14:57:54.343 に答える