2010-09-29 7 views
15

Sto usando PHP 5.2.6. Voglio avere un valore predefinito per un argomento in un metodo, ma sembra che sto diventando un po 'troppo intelligente.Posso impostare un argomento di metodo predefinito con la proprietà di classe in PHP?

La proprietà di classe blnOverwrite è predefinita e impostabile altrove nella classe. Ho un metodo in cui voglio renderlo nuovamente impostabile, ma non sovrascrivere il valore esistente. Ottengo un errore quando provo questo:

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

Devo fare qualcosa di simile?

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

sì questo è il modo corretto – Galen

risposta

11

Sì, devi farlo in questo modo. Non è possibile utilizzare un valore membro per il valore dell'argomento predefinito.

From the PHP manual on Function arguments: (sottolineatura mia)

Una funzione può definire C++ - valori di default stile per argomenti scalari. [...] PHP consente anche l'uso di matrici e il tipo speciale NULL come valori predefiniti. [...] Il valore predefinito deve essere un'espressione costante, non (ad esempio) una variabile, un membro della classe o una chiamata di funzione. [...] Si noti che quando si usano argomenti predefiniti, qualsiasi valore di default dovrebbe essere sul lato destro di qualsiasi argomento non predefinito; altrimenti, le cose non funzioneranno come previsto.

0

appena possibile accorciare un po ':

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

ma questo è quasi la stessa

3

si deve fare in questo modo, per quanto ne so, o utilizzare una classe costante dal PHP 5.3 ma naturalmente è fisso e non può essere cambiato in seguito, quindi vorrei assolutamente andare con la propria soluzione:

class foo{ 
    const constant = 'bar'; 

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

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

È assolutamente possibile farlo. Il meglio di entrambi i mondi: inizializza la proprietà predefinita E l'argomento predefinito del tuo metodo con una costante di classe.

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) 
Problemi correlati