que ejemplos clases __construct php inheritance oop

ejemplos - Llamar al constructor padre antes del constructor hijo en PHP



php constructor parameters (4)

Me preguntaba si es posible llamar a los padres __construct () antes de que __construct () del niño herede en PHP.

Ejemplo:

class Tag { __construct() { // Called first. } } class Form extends Tag { __construct() { // Called second. } } new Form();

Idealmente, podría hacer algo entre ellos. Si esto no es posible, ¿hay alguna alternativa que me permita hacer esto?

La razón por la que quiero hacer esto es poder cargar una gran cantidad de configuraciones predeterminadas específicas de la etiqueta que Formulario puede usar cuando se llama a __construct ().

EDITAR: Perdón, olvidé agregar esto ... Prefiero no llamar a la clase para padres desde la clase para niños. Es simplemente porque expone algunos datos privados (para el padre) al niño, cuando lo pasa como un argumento

Esto es lo que quiero hacer:

$tag = new Tag($privateInfo, $publicInfo); $tag->extend(new Form()); // Ideal function, prob doesn''t work with inheritance.

Tag.php

class Tag { private $privateInfo; public $publicInfo; __construct($private, $public) { $this->privateInfo = $private; $this->publicInfo = $public; } }

Form.php

class Form extends Tag { __construct() { echo $this->publicInfo; } }

¿Tener sentido?

¡Gracias! Matt Mueller


Por los sonidos que tenga, es posible que desee replantear su diseño para que no tenga que pasar los parámetros en el constructor. Si no crees que se puede hacer, hazlo como una pregunta, es posible que te sorprendan algunas de las sugerencias.

La clase secundaria tiene la capacidad de anular el constructor principal sin llamarlo en absoluto. Yo recomendaría tener un método final en la clase para padres. De esta forma, todos saben que no desea que se anule esta opción, y cualquier clase heredada (con razón) tiene acceso para hacer lo que quiera en el constructor.

class Father { private $_privateData; final function setPrivateData($privateData) { $this->_privateData = $privateData; } }

Otra solución no recomendada, más la de "reinventar la rueda", sería definir una función en la clase padre, digamos _construct (), que se llama en su propia construcción. No es muy claro, no usa características de lenguaje / construcciones, y es muy específico para una sola aplicación.

Una última cosa para tener en cuenta: realmente no se puede ocultar información de la clase infantil. Con Reflection, serialize, var_dump, var_export y todas estas otras API útiles en el lenguaje php, si hay un código que no debería hacer nada con los datos, entonces no hay mucho que pueda hacer para evitar almacenarlo. Hay bibliotecas y otras que ayudan a crear cajas de arena, pero es difícil aislar un objeto de sí mismo.

Editar: de alguna manera me perdí la respuesta de Artefacto, y supongo que tiene razón (nunca he intentado escribir una extensión para hacer eso). Aún así, su implementación rompe las expectativas del desarrollador al tiempo que hace que sea más difícil ver el código para explicar lo que está sucediendo.


Sí, pero solo internamente (es decir, al escribir una extensión de PHP), así que, si yo fuera tú, me conformaría con llamar a parent::__construct() . Vea esta sección en la wiki de PHP.

Lo sentimos, PHP no es Java. Creo que no requerir (implícita o explícitamente) que se llame al superconstructor fue una decisión de diseño muy pobre.


Simplemente llame a parent :: __build en el niño.

class Form extends Tag { function __construct() { parent::__construct(); // Called second. } }


sí, simplemente llama a parent::__construct() en tu construcción