2012-06-28 17 views
5

que estaba buscando a través de la documentación de PHP y vieron varios comentarios en una variable se ha inicializado fuera del constructor de una clase, de forma similar a la siguiente:Inicialización de las variables fuera de PHP constructor

classMyClass { 
    private $count = 0; 

    public function __construct() { 
     //Do stuff 
    } 
} 

En objetos PHP, patrones, y la práctica, el autor recomienda utilizar construcciones solo para la inicialización de propiedades, lo que difiere cualquier levantamiento pesado o lógica compleja a métodos especializados. Este tutorial (un ejemplo rápido que encontré en Google) también recomienda usar constructores para inicializar propiedades: http://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-3.php.

¿Por qué le gustaría inicializar una variable fuera del constructor? ¿Es esto simplemente una codificación descuidada, o hay alguna razón para hacer algo como esto? Tengo que decir que hasta hace poco, inicialicé los valores predeterminados fuera del constructor, y no parece haber ninguna ventaja programática de una manera sobre la otra.

+2

Es solo una buena práctica de programación. – Brian

+0

cuando solo quiere inicializar variables simples, es bastante claro hacerlo fuera del constructor, para inicializaciones más complejas use el constructor –

+0

El ejemplo que ha publicado proporciona un valor predeterminado para la variable $ count. Es una buena idea proporcionar un valor predeterminado: de esta manera sabrá qué probar para saber si la asignación en su constructor o en otro lugar ha tenido éxito. – blearn

Respuesta

5

Cuando inicializa una variable fuera del constructor, debe inicializarse como una constante. No puede hacer ninguna operación para inicializarlo. Por lo tanto, el valor inicial de ese miembro es en realidad una parte de la firma de clase.

Por ejemplo, esto no es válido:

private $var = $othervar; 
private $var = func(); 

que podría hacerlo en el constructor así, pero sería un poco más detallado y añadir un poco de desorden al constructor a menos que hubiera algún tipo de lógica pasando.

+0

Así que no hay ninguna razón para * no * inicializar una variable fuera del constructor si se les asigna un valor conocido, como una cadena? – Nate

2

un comentario Más que una respuesta, pero por favor Elaborar un poquito:

Puesto que se recomienda el uso de constructores para la inicialización única propiedad,

que dice esto y por qué? Supongo que el solo se relaciona con algo más que las definiciones de propiedad con valores predeterminados.


Una parte respuesta:

De forma predeterminada en las variables de PHP no necesita ser definida porque las variables se definen entonces cuando se accede por primera vez en un contexto de escritura. Todas las variables, incluyendo las no definidas contienen NULL (Demo):

class A {} 

$a = new A; 

var_dump($a->property); # NULL 

variables de clase Introducing (propiedades) PHP después se dejó para definir realmente variables. Los que aún volver NULL por defecto, pero son definido (Demo):

class A { 
    public $property; 
} 

$a = new A; 

var_dump($a->property); # NULL 

En el siguiente paso de la evolución, esta construcción del lenguaje también permite especificar una expresión constante. Eso es constante porque la definición es tiempo de compilación (no tiempo de ejecución como cuando se invoca el constructor). Un ejemplo (Demo):

class A { 
    public $property = 'hello'; 
} 

$a = new A; 

var_dump($a->property); # string(5) "hello" 

Como se trata de compilación, pero el constructor en tiempo de ejecución, se me hace difícil comparar ambos cuentan con otro. Tampoco está claro por qué dice que se recomienda inicializar a través del constructor.

+0

Consulte mis actualizaciones de mi pregunta: agregué la fuente que tenía en mente para ese reclamo. – Andrew

+0

Bien: un sitio con el nombre "Killer PHP" y el eslogan "Tutoriales de PHP para diseñadores web" podría no entrar tanto en detalle como le gustaría saber. No puedo ver nada incorrecto al definir las propiedades del objeto. Puede inicializar más tarde si lo desea, pero debe definirlos. Si su valor inicial debe ser algo diferente de 'NULL' pero una expresión constante, defínalos con el valor inicial. Eso no es nada malo. De hecho, hace que su constructor sea menos complicado, lo que * es * algo bueno. Los constructores deberían ser tontos, no deberían hacer mucho. – hakre

+0

Gracias. Estaba principalmente confundido porque he visto un buen código escrito principalmente con inicialización fuera del constructor, pero parece que la mayoría de las cosas que he leído me han recomendado inicializar dentro del constructor. Puedo ver cómo está menos desordenado (lo que es motivo suficiente para hacerlo), pero no he encontrado ninguna otra ventaja práctica en PHP por tener el establecimiento de un valor predeterminado para la propiedad de instancia fuera del constructor. Gracias por tu respuesta bien pensada. – Andrew

0

Lejos de descuidar ... es una buena práctica de programación. Como también haría en Java/C++, simplemente los configura, y luego puede hacer cualquier inicialización en el constructor, generalmente para enviarlos a los no predeterminados como tales.

Cuestiones relacionadas