Pregunta

¿Hay alguna ventaja al usar __construct () en lugar del nombre de la clase para un constructor en PHP?

Ejemplo ( __construct ):

class Foo {
    function __construct(){
        //do stuff
    }
}

Ejemplo (llamado):

class Foo {
    function Foo(){
        //do stuff
    }
}

Tener el método __construct (primer ejemplo) es posible desde PHP 5.

Es posible tener un método con el mismo nombre que la clase como constructor (segundo ejemplo) desde PHP versión 4 hasta versión 7.

¿Fue útil?

Solución

Estoy de acuerdo con Gizmo, la ventaja es que no tienes que cambiarle el nombre si cambias el nombre de tu clase. SECO.

Del mismo modo, si tiene una clase secundaria, puede llamar

parent::__construct()

para llamar al constructor padre. Si más adelante en la pista, cambia la clase de la que hereda la clase secundaria, no tiene que cambiar la llamada de construcción a la principal.

Parece una cosa pequeña, pero faltar al cambiar el nombre de la llamada del constructor a las clases de tus padres podría crear errores sutiles (no tan sutiles).

Por ejemplo, si insertó una clase en su herencia, pero olvidó cambiar las llamadas del constructor, podría comenzar a llamar constructores de abuelos en lugar de padres. Esto a menudo puede causar resultados indeseables que pueden ser difíciles de notar.

También tenga en cuenta que

  

A partir de PHP 5.3.3, los métodos con el mismo nombre que el último elemento de un nombre de clase con espacio de nombre ya no serán tratados como constructores. Este cambio no afecta a las clases sin espacios de nombre.

Fuente: http://php.net/manual/en/language. oop5.decon.php

Otros consejos

__construct se introdujo en PHP5. Es la forma en que se supone que debes hacerlo ahora. Sin embargo, no conozco ninguna ventajas per se.

Del manual de PHP:

Para compatibilidad con versiones anteriores, si PHP 5 no puede encontrar una función __construct () para una clase dada, buscará la función de constructor de estilo antiguo, por el nombre de la clase. De hecho, significa que el único caso que tendría problemas de compatibilidad es si la clase tuviera un método llamado __construct () que se usó para diferentes semánticas

Si estás en PHP5, recomendaría usar __construct para evitar que PHP se vea en otra parte.

La principal ventaja que veo para __construct, es que no tienes que cambiar el nombre de tu constructor si cambias el nombre de tu clase.

Hoy, la respuesta aceptada está obsoleta.

Cambiar el nombre de las clases es una mala práctica: tienes que recordar qué y dónde cambiar el nombre cada vez que actualices a una versión más nueva. A veces (como usar Reflexión o estructura de dependencia compleja) puede ser imposible sin una refactorización radical. Y esta es la complejidad accidental que desea evitar. Es por eso que espacios de nombres se introdujeron en PHP. Java, C ++ o C # no usan __construct , usan un constructor con nombre y no hay problemas con ellos.

  

A partir de PHP 5.3.3, los métodos con el mismo nombre que el último elemento de un nombre de clase espacio de nombre ya no serán tratados como constructores. Este cambio no afecta a las clases sin espacios de nombre .

Ejemplo

namespace Foo;
class Test {
  var $a = 3;

  function Test($a) {
    $this->a = $a;
  }

  function getA() {
    return $this->a;
  }
}

$test = new Test(4);
echo $test->getA(); // 3, Test is not a constructor, just ordinary function

Tenga en cuenta que los constructores nombrados no están en desuso (PHP 5.5 hoy). Sin embargo, no puede predecir que su clase no se utilizará en el espacio de nombres, por lo tanto __construct debe ser preferido.

Aclaración sobre la mala práctica mencionada anteriormente (para Dennis)

En algún lugar de tu código puedes usar ReflectionClass :: getName () ; cuando cambie el nombre de la clase, debe recordar dónde usó Reflection y verificar si el resultado de getName () aún es consistente en su aplicación. Cuanto más necesite recordar algo específico, es más probable que se olvide algo, lo que se traduce en errores en la aplicación.

Los padres no pueden tener control sobre todas las clases en el mundo que dependen de ellas. Si allow_url_include está habilitado, es posible que otra web esté usando el clase de su servidor, que puede fallar si cambia el nombre de alguna clase. Es aún peor en los lenguajes compilados mencionados anteriormente: la biblioteca se puede copiar y agrupar en otro código.

No hay ninguna razón para cambiar el nombre de clase:

  • si el nombre de la clase está en conflicto, use espacios de nombres
  • si la responsabilidad de la clase cambia, deriva alguna otra clase en su lugar

En las clases de PHP en el espacio de nombres, el método con el mismo nombre debe evitarse de todos modos: intuitivamente debería producir un objeto creado la clase; Si hace algo más, ¿por qué darle el mismo nombre? Debe ser un constructor y nada más. El problema principal es que el comportamiento de tal método depende del uso del espacio de nombres.

No hay ningún problema con __construct constructors en PHP. Pero no fue la idea más inteligente modificar los constructores nombrados.

La mejor ventaja de usar __contruct () en lugar de ClassName () es al extender clases. Es mucho más fácil llamar a parent :: __ construct () en lugar de parent :: ClassName () , ya que es reutilizable entre clases y el padre se puede cambiar fácilmente. / p>

En su ejemplo, Foo :: Foo a veces se llama PHP 4 o constructor de estilo antiguo porque proviene de los días de PHP 4:

class Foo {
    // PHP 4 constructor
    function Foo(){
        //do stuff
    }
}

los constructores de PHP 4 estarán en desuso pero no se eliminarán en PHP 7. Ya no estarán ser considerado como un constructor en cualquier situación en PHP 8. La compatibilidad futura es definitivamente una razón importante para no usar esta función.

En PHP 5, la ventaja sería que el rendimiento sería mejor. Buscará un constructor con el nombre de __construct y, si no lo encuentra, buscará los constructores con el nombre de className . Por lo tanto, si encuentra un constructor con el nombre __construct , no es necesario que busque un constructor con el nombre className .

Bueno, han pasado algunos años desde que se hizo esta pregunta, pero creo que todavía tengo que responder a esta, porque las cosas han cambiado y para los lectores en el futuro, quiero mantener la información actualizada.


Entonces, en php-7, eliminarán la opción para crear el constructor como una función con el mismo nombre que la clase. Si aún lo haces, obtendrás un E_DEPRECATED .

Puede leer más sobre esta propuesta (se acepta la propuesta) aquí:   https://wiki.php.net/rfc/remove_php4_constructors

Y una cita de allí:

  

PHP 7 emitirá E_DEPRECATED siempre que se defina un constructor PHP 4 . Cuando el nombre del método coincide con el nombre de la clase, la clase no está en un espacio de nombres, y un constructor PHP 5 (__construct) no está presente, se emitirá un E_DEPRECATED. PHP 8 dejará de emitir E_DEPRECATED y los métodos no se reconocerán como constructores.

Además, no obtendrá un E_STRICT en php-7 si define un método con el mismo nombre que la clase Y un __construct () .

Puedes ver esto también aquí:

  

PHP 7 también dejará de emitir E_STRICT cuando esté presente un método con el mismo nombre que la clase, así como también __construct.


Por lo tanto, te recomendaría que uses __construct () , ya que tendrás menos problemas con esto en el futuro.

Compatibilidad hacia adelante. Siempre existe la posibilidad de que el código heredado que se deja en el idioma por motivos de compatibilidad con versiones anteriores se elimine en una versión futura.

Si hay métodos __construct y SameAsClassName luego se ejecutará __construct, se omitirá el método SameAsClassName.

Creo que la razón principal es que es la convención del lenguaje. No es necesario forzar a un idioma para que actúe como alguien más.

Quiero decir, en Objective-C prefieres los constructores con -init, por ejemplo. Puedes hacer tu propio constructor usando tu nombre de clase, pero ¿por qué? ¿Hay alguna razón para usar este esquema en lugar de la convención del idioma?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top