¿Por qué Magento tiene métodos construct y construct?


¿Hay alguna razón por la que Magento tiene un método _construct y un método __construct? ¿Por qué existe el _construct adicional? ¿Se puede lograr algo con el método extra _construct simplemente llamando al constructor padre en la clase hija?

Author: Nick, 2012-01-03

3 answers

La mejor respuesta que puedo encontrar: http://www.magentocommerce.com/boards/viewthread/76027/#t282659

Básicamente, la clase de nivel raíz (de la que heredan todas las demás clases) implementa __construct, a la que PHP llama automáticamente cada vez que se construye una clase. En este momento, esta clase de nivel raíz simplemente llama a _construct, que contiene el código real.

Digamos que tienes esta configuración:

class BaseClass {
   function __construct() {
       print "In BaseClass constructor\n";
       doSomethingReallyImportant();
   }
}

class SubClass extends BaseClass {
   function __construct() {
       print "In SubClass constructor\n";
   }
}

$obj = new BaseClass();
//"In BaseClass constructor"
//something really important happens

$obj = new SubClass();
//"In SubClass constructor"
//important thing DOESN'T happen

PHP no llama automáticamente a los constructores de clase padre, por lo que doSomethingReallyImportant nunca obtiene called. Podrías requerir que los constructores de subclases llamen parent::__construct(), pero eso es fácil de olvidar. Así que Magento tiene subclases override _construct:

class BaseClass {
   function __construct() {
       doSomethingReallyImportant();
      _construct();
   }
   function _construct() {
       print "In BaseClass constructor\n";
   }
}

class SubClass extends BaseClass {
   function _construct() {
       print "In SubClass constructor\n";
   }
}

$obj = new BaseClass();
//something really important happens
//"In BaseClass constructor"

$obj = new SubClass();
//something really important happens
//"In SubClass constructor"

PHP no detecta un constructor en SubClass, por lo que llama al constructor de BaseClass. Esto permite a BaseClass a doSomethingReallyImportant antes de llamar a _construct de la SubClase sobrescrita.

 65
Author: benesch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-02 23:35:01

A Marco: es incorrecto anular __construct() método como este en Magento. La razón es - todas las clases lo heredan de Varien_Object y tiene este código:

#File: lib/Varien/Object.php 
public function __construct() 
{     
      //...snip...             
      $args = func_get_args();     
      if (empty($args[0])) 
      {         
          $args[0] = array();     
      }     
      //...snip... 
} 
//... 

Con la construcción __usando su código, esos argumentos no se pasan. Realmente tienes que usar el código de Benesch:

class SubClass extends BaseClass {
   function _construct() {
       print "In SubClass constructor\n";
   }
}

Lea más sobre esto en Magento Block Lifecycle Methods by Alan Storm

 4
Author: PICher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-05 06:18:26

Editar: lo sentimos, se perdió la diferencia entre _construct y __construct en su pregunta. Creo que los programadores de Magento han tratado de hacer más fácil anular el constructor sin el riesgo de que su propio constructor no sea llamado más. El método _construct en Varien_Object está vacío, por lo que no importa si no se llama desde subclases.


Así es como PHP implementa constructores y destructores para clases. No hay nada específico sobre Magento se.

En otros lenguajes el constructor es usualmente implementado con un método que tiene el mismo nombre que la clase misma y el constructor usualmente tiene una tilde (~) delante del nombre del método con el mismo nombre que la clase. Por alguna razón la gente de PHP lo ha implementado de esta manera aunque PHP también parece soportar constructores y destructores con el nombre de clase (link).

Una clase no tiene que tener un constructor y / o destructor, especialmente cuando subclase otra clase. Si anula el constructor o destructor, entonces necesita llamar al constructor o destructor de la clase anulada manualmente llamándolo en parent::, como:

class SubClass extends BaseClass {
   function __construct() {
       parent::__construct();
       // Your code
   }
   function __destruct() {
       // Your code
       parent::__destruct();
   }
}
 3
Author: Marco Miltenburg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-18 19:34:47