2011-01-13 6 views
1

Gibt es eine Möglichkeit, ein neues PHP-Objekt auf ähnliche Weise wie in jQuery zu instanziieren? Ich spreche über die Zuweisung einer variablen Anzahl von Argumenten beim Erstellen des Objekts. Zum Beispiel weiß ich, ich so etwas wie tun könnte:jQuery-Stil-Konstruktoren in PHP

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

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

Aber ich möchte nur einige von ihnen vielleicht setzen. So etwas wie:

Was ist mehr entlang der Linien wie es in jQuery und anderen Frameworks getan wird. Ist das in PHP integriert? Gibt es einen Weg, es zu tun? Oder ein Grund, warum ich es vermeiden sollte?

+0

möglich Duplikat [Rubine wie Array-Argumente Implementierung in PHP] (http://stackoverflow.com/questions/870501/ruby-like-array-arguments-implementation-in-php) –

+0

Hier ist ein Problemumgehung (einschließlich einer Beschreibung seiner Nachteile): http://stackoverflow.com/questions/2112913 –

Antwort

4

die beste Methode, dies zu tun ist mit einem Array:

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

Und dann mit einem Array konstruieren

$data = array(
    'first' => "hello" 
    //Etc 
); 
$Object = new Sample($data); 
+0

Nicht was er will, obwohl. Er will * Namen * Argumente verwenden, die –

+0

in beliebiger Reihenfolge angegeben werden kann, Ja ich in der Mitte der Aktualisierung war:/ – RobertPitt

+0

Das Update ein paar gute Informationen hat. +1. (Obwohl ich persönlich die Standardwerte für die Parameter bereitstellen würde, anstatt sie null zu lassen) ... – ircmaxell

2
class foo { 
    function __construct($args) { 
     foreach($args as $k => $v) $this->$k = $v; 
     echo $this->name; 
    } 
} 

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

Die nächstgelegene ich denken konnte.

Wenn Sie mehr Lust sein und wollen nur bestimmte Tasten ermöglichen, können Sie __set() (nur auf PHP 5)

var $allowedKeys = array('name', 'age', 'hobby'); 
public function __set($k, $v) { 
    if(in_array($k, $this->allowedKeys)) { 
     $this->$k = $v; 
    } 
} 
+3

Variable Variablen? Innerhalb einer Klasse? "Ja wirklich?" Warum nicht '$ this -> $ k' anstelle von' $$ k' verwenden? Anständige Idee, falsche Umsetzung ... Wenn Sie das tun würden, warum nicht einfach ['extract'] (http://us2.php.net/extract) verwenden? -1 ... – ircmaxell

+0

+1 Beat mich dazu. – Fenton

+0

wups, dankt die für die Korrektur, herausgegeben –

0

args funktionieren nicht bekommen verwenden, wie PHP man nur sehen Argument übergeben.

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

haben eine looksee bei json_decode()

+0

json Verwendung ist in diesem Fall unsinnig. (Eine native Array wäre nicht brauchen, um unnötig en/decodiert.) –

+0

vereinbart - aber nur die OPs anfängliche Anforderung Adressierung. Es ist nicht notwendig, json zu codieren, um die Objektinstanzierung zu übergeben, sondern müsste immer dekodiert werden. –

-1

Der nächstgelegene ich von ist denken kann array() und extract() zu verwenden.

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

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

    // extract the options 
    extract ($options); 

    // stuff 
    ... 

} 

Und bei der Erstellung.

$p1 = new person(array(
    'name' => "bob", 
    'eyes' => "blue" 
));