Las respuestas dadas hasta ahora son incorrectas. Puede hacer lo que quiera con el valor de retorno de un constructor, por lo que no es cierto que "No se puede hacer nada con el valor de retorno de un constructor (además de usar el objeto que creó)". El valor de retorno de un constructor no es el objeto "creado". El constructor no crea objetos (la palabra clave new
sí). El valor de retorno de un constructor es el mismo que el de cualquier otra función: lo que elija devolver. Además, también es falso que un objeto ya exista para llamar a su constructor. Esto es perfectamente válido:
$parent_constructor_return_value = parent::__construct();
Por ejemplo:
abstract class MyBase {
function __construct() {
return "Hello, world.";
}
}
class MyDerived extends MyBase {
function __construct() {
echo parent::__construct();
}
}
new MyDerived(); // prints "Hello, world."
Aunque esto es posible, no se puede concebir un escenario en el que lo mejor sería práctica.Después de todo, siempre puede llamar a un método que no sea parent::__construct()
para obtener su valor, y todo lo que pierde es oscuridad. Supongo que podría ser utilizado como una forma de control de errores - Hay otras dos maneras de lograr lo mismo:
- excepciones tiro en el constructor de los padres y atraparlos en su constructor derivada.
- Establezca las propiedades en el constructor principal indicando que ocurrió un error, y luego verifique el estado de esas propiedades en el constructor derivado.
Si un error en un constructor principal no es excepcional, podría haber decidido que el constructor padre devuelva los valores de error, en lugar de almacenar la información de error transitorio como propiedades del objeto. Por supuesto, entonces la única razón para nombrar el método del padre __construct
es si la clase padre no es abstracta, sino que puede ser instanciada, pero en ese contexto, los mensajes de error devueltos nunca se verán. Entonces, mal patrón; malo. Los constructores no tienen la intención de devolver valores, lo que significa que está abriendo una lata de gusanos arquitectónicos mediante el aprovechamiento de este mecanismo.
No creo que los constructores devuelvan objetos: creo que PHP instancia una nueva instancia de la clase dada, y luego llama a su constructor antes de que el usuario pueda hacer algo. –
Gracias por la corrección. Después de volver a leer mi publicación, busqué un comentario para decir exactamente lo que publicaste :) – Nate