2010-09-29 3 views
15

Ich benutze PHP 5.2.6. Ich möchte einen Standardwert für ein Argument in einer Methode haben, aber es scheint, dass ich ein bisschen zu schlau bin.Kann ich in PHP ein Standardmethodenargument mit Klasseneigenschaft einrichten?

Die Klasseneigenschaft blnOverwrite ist an anderer Stelle in der Klasse voreingestellt und einstellbar. Ich habe eine Methode, wo ich es wieder einstellbar machen möchte, aber nicht den vorhandenen Wert überschreiben. Ich erhalte eine Fehlermeldung, wenn ich das versuchen:

public function place($path, $overwrite = $this->blnOverwrite) { ... } 

Muss ich etwas tun?

public function place($path, $overwrite = NULL) { 
    if (! is_null($overwrite)) { 
     $this->blnOverwrite = $overwrite; 
    } 
    ... 
} 
+3

ja das ist der richtige Weg – Galen

Antwort

11

Ja, Sie müssen es so machen. Sie können keinen Elementwert für den Standardargumentwert verwenden.

From the PHP manual on Function arguments: (emphasis Mine)

Eine Funktion C++ definieren kann - Werte Standardstil für skalare Argumente. [...] PHP erlaubt auch die Verwendung von Arrays und den speziellen Typ NULL als Standardwerte. [...] Der Standardwert muss ein konstanter Ausdruck sein, nicht (zum Beispiel) eine Variable, ein Klassenmember oder ein Funktionsaufruf. [...] Beachten Sie, dass bei Verwendung von Standardargumenten alle Standardeinstellungen auf der rechten Seite aller nicht standardmäßigen Argumente stehen sollten. Andernfalls werden die Dinge nicht wie erwartet funktionieren.

0

Sie können es ein wenig verkürzen:

public function place($path, $overwrite = NULL) { 
    if(!is_null($overwrite))$this->blnOverwrite = $overwrite; 
    ... 
} 

, aber das ist fast die gleiche

3

Sie müssen es auf diese Weise tun, afaik oder eine Klasse Konstante verwenden 5.3 ab PHP aber natürlich es ist behoben und kann später nicht geändert werden, also würde ich definitiv mit Ihrer eigenen Lösung gehen:

class foo{ 
    const constant = 'bar'; 

    public function place($path, $overwrite = self::constant) { 
     die('bla' . $overwrite); 
    } 
} 

$bar = new foo(); 
$bar->place('baz'); 
10

Sie können dies absolut tun. Das Beste aus beiden Welten: Initialisieren Sie Ihre Standardeigenschaft UND das Standardargument Ihrer Methode mit einer Klassenkonstante.

class Object { 

    const DEFAULT_BLNOVERWRITE = TRUE; 

    protected $blnOverwrite = self::DEFAULT_BLNOVERWRITE; 

    public function place($path, $overwrite = self::DEFAULT_BLNOVERWRITE) { 
     var_dump($overwrite); 
    } 
} 

$Object = new Object(); 
$Object->place('/'); //bool(true) 
Verwandte Themen