Perché un object PHP accetta membri che sono stati citati solo quando chiamati?

Sono in un paradosso con il seguente frammento di codice e non sono sicuro di come chiamarlo.

Ho definito una class molto semplice che non ha ancora variables. Ora, nel constructor, sto accettando una serie di chiavi e valori e assegnando le variables al volo in questo modo, utilizzando un ciclo foreach:

class Food{ function Food($construct){ foreach($construct as $key=>$value){ $this->$key = $value; } } } 

Se ora ho creato un'istanza con l'input in questo modo:

 $food = new Food(arrays('name' => 'chicken' , 'unit' => 'kg' , 'calorie' => 10000)); 

Avrei avuto:

 var_dump($food); object(Food)[1] public 'name' => string 'chicken' (length=7) public 'unit' => string 'kg' (length=2) public 'calorie' => int 10000 

Com'è ansible?

Questo è ansible in PHP ed è l'implementazione predefinita a less che tu non abbia dichiarato diversamente (tramite __get () e __set ()). La creazione di membri pubblici al volo è ansible solo per l'istanza corrente, non la crea per la class in generale. Ed è ansible dall'interno della class o dall'esterno (ad esempio tramite l'istanza).

 $food->smth = 100; 

creerà public smth

Un metodo magico __set() vuoto può impedire questo comportmento

 public function __set($name, $value) { } 

Per la seconda domanda:

Non è sicuro e l'utilizzo di membri pubblici non è sicuro (a less che tu non abbia una buona ragione per esporre le tue properties;). La convenzione dice che devi avere per lo più membri privati ​​/ protetti con accessor per loro. Quindi puoi avere il controll per la class all'interno della class piuttosto che dall'istanza di essa. E per molti altri motivi, inclusa la riusabilità del codice.

Quella variabile non è non inizializzata, è solo non dichiarata.

Dichiarare le variables in una definizione di class è un punto di riferimento per la leggibilità. Inoltre puoi impostare l'accessibilità (privata o pubblica).

In each caso, dichiarare le variables in modo esplicito non ha nulla a che fare con OOP, è specifico del linguaggio di programmazione. In Java non puoi farlo perché le variables devono essere dichiarate esplicitamente.

riferimento – http://stackoverflow.com/questions/1086494/when-should-i-declare-variables-in-a-php-class