2010-07-09 10 views
33

me pregunto si hay alguna diferencia entrePHP inicializar variable en __construct() vs declaración

class TestClass { 
    private $_var = "abc"; 
} 

vs

class TestClass { 
    private $_var; 
    function __construct() { 
     $this->_var = "abc"; 
    } 
} 

me pregunto si esta última es la forma preferida/mejor práctica? ¿Hay alguna diferencia funcional?

+0

fwiw - actionscript advierte sobre la inicialización de objetos en la declaración de la clase. Entonces, si 'private $ _var =" abc "' podría ser aceptable, 'private $ _var = new SpecializedClass();' no sería –

+0

Incluso muchos desarrolladores de experiencia pueden confundir con esto. Use el constructor para la inicialización dinámica. Aquí hay un hilo similar http://stackoverflow.com/questions/7088585/initializing-class-member-variables-with-expressions-concatenated-string-in-ph – kta

Respuesta

22

Son efectivamente lo mismo. Prefiero el primero, porque entonces solo hay un lugar para buscar el valor y su valor predeterminado.

Por otro lado, si necesita hacer algo dinámico con él o configurarlo en otra cosa que no sea una matriz o primitiva, debe usar la segunda forma. Notablemente, no puede usar una llamada a función para declarar una variable en el primer formulario.

+1

hmm, supongo que eso lo explica, el primer método solo puede ser utilizado para la creación de instancias simples, el segundo es si el procesamiento complejo si es necesario, por ejemplo. Llamadas a función o if/else etc. –

+0

Creo que otra buena razón para preferir el anterior es que los valores predeterminados se mantendrán incluso si extiende la clase y sobrescribe el constructer. – Adam

3

¡Excelente pregunta! Siento que el primer ejemplo es más correcto, si ya conoces el valor inicial del atributo del objeto, ¿por qué quieres declararlo en el constructor?

Creo que el propósito del constructor es establecer atributos que pueden ser variables.

En todo caso, parece una cosa de legibilidad. No conozco ningún problema de rendimiento con ninguno de los métodos.

1

No tengo conocimiento de ninguna diferencia en sus ejemplos, ambos parecen comportarse igual. si haces ambas cosas, el código del constructor anula la inicialización realizada en la sección de declaración.

Personalmente vengo del fondo C++ y en lenguajes tipados estáticamente todas las declaraciones ocurren dentro del cuerpo de la clase pero fuera de cualquier función, y todas las inicializaciones y otras preparaciones de clase ocurren dentro del constructor.

Cuando la inicialización se hace como en su primer ejemplo y hay algún código haciendo algo en el constructor, me parece que se mezclan paradigmas de codificación, por lo que aunque es más detallado, tiendo a elegir su segundo ejemplo para mi propio estilo de código.

Cuestiones relacionadas