2011-01-13 6 views
1

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

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

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

しかし、私はそれらのいくつかだけを設定したいと思います。したがって、次のようなものがあります。

これは、jQueryやその他のフレームワークでどのように行われているのかに沿っています。これはPHPに組み込まれていますか?それを行う方法はありますか?それとも避けなければならないのか?

+0

可能重複(http://stackoverflow.com/questions/870501/ruby-like-array-arguments-implementation-in-php) –

+0

であります回避策(その短所の説明を含む):http://stackoverflow.com/questions/2112913 –

答えて

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); 
+0

しかし、彼が望むものではありません。彼は任意の順序で指定できる*名前付き引数を使用したいと思っています –

+0

そうです、私は更新の途中でした:/ – RobertPitt

+0

更新プログラムには素晴らしい情報がたくさんあります。 +1。 (私は個人的に、それらをnullのままにするのではなく、パラメータにデフォルトを提供しますが)... – ircmaxell

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

変数変数?クラスの中に?本当に? '$$ k 'の代わりに' $ this-> $ k'を使わないのはなぜですか?まともなアイデア、間違った実装...もしあなたがそれをやろうとしたら、単に['extract'](http://us2.php.net/extract)を使うのではないのですか? -1 ... – ircmaxell

+0

+1私にそれを打つ。 – Fenton

+0

wups、訂正ありがとう、 –

0

PHPは一つだけを見るように引数が機能しません取得引数が渡されます。

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

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

+0

この例ではjsonの使用は無意味です。 (ネイティブアレイは不必要にエンコード/デコードする必要はありません)。 –

+0

は合意しましたが、OPの初期要求に対処するだけです。オブジェクトのインスタンス化を渡すためにjsonをエンコードする必要はありませんが、常にデコードが必要です。 –

-1

でlookseeを持っています。

... 
//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" 
)); 
[PHPでルビー状配列引数の実装]の
関連する問題