Constructeurs et destructeurs

Constructeur

void __construct ([ mixed $args [, $... ]] )

PHP permet aux développeurs de déclarer des constructeurs pour les classes. Les classes qui possèdent une méthode constructeur appellent cette méthode à chaque création d'une nouvelle instance de l'objet, ce qui est intéressant pour toutes les initialisations dont l'objet a besoin avant d'être utilisé.

Note: Les constructeurs parents ne sont pas appelés implicitement si la classe enfant définit un constructeur. Si vous voulez utiliser un constructeur parent, il sera nécessaire de faire appel à parent::__construct() depuis le constructeur enfant. Si l'enfant ne définit pas un constructeur alors il peut être hérité de la classe parent, exactement de la même façon qu'une méthode le serait (si elle n'a pas été déclarée comme privée).

Exemple #1 Exemple d'utilisation des nouveaux constructeurs unifiés

<?php
class BaseClass {
	function __construct() {
		print "In BaseClass constructor\n";
	}
}

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

class OtherSubClass extends BaseClass {
	// Constructeur hérité de la classe BaseClass
}

// Dans le constructeur de la classe BaseClass
$obj = new BaseClass();

// Dans le constructeur de la classe BaseClass
// In SubClass constructor
$obj = new SubClass();

// Dans le constructeur de la classe BaseClass
$obj = new OtherSubClass();
?>

Pour des raisons de compatibilité ascendante, si PHP ne peut pas trouver une fonction __construct() pour une classe donnée, et que la classe n'en hérite pas de la classe parent, il cherchera une fonction constructeur représentée, comme dans l'ancien style (PHP < 5), par le nom de la classe. Dans les faits, cela signifie que le seul cas où il pourrait y avoir un problème de compatibilité est celui où votre classe contiendrait une méthode nommée __construct() et que vous en ayez un autre usage.

A la différence des autres méthodes, PHP ne génèrera pas d'erreur de niveau E_STRICT lorsque __construct() est surchargé avec des paramètres différents du __construct() parent.

Depuis PHP 5.3.3, les méthodes ayant le même nom que la classe dans laquelle elle se trouve ne sont plus traitées comme des constructeurs, si la classe considérée se situe dans un espace de noms. Ceci n'affecte pas les classes sans espace de noms.

Exemple #2 Constructeurs dans des classes dans des espaces de noms

<?php
namespace Foo;
class Bar {
	public function Bar() {
		// Traitée comme un constructeur dans PHP 5.3.0-5.3.2
		// Traitée comme une méthode normale depuis PHP 5.3.3
	}
}
?>

Destructeur

void __destruct ( void )

PHP 5 introduit un concept de destructeur similaire à celui d'autres langages orientés objet, comme le C++. La méthode destructeur est appelée dès qu'il n'y a plus de référence sur un objet donné, ou dans n'importe quel ordre pendant la séquence d'arrêt.

Exemple #3 Exemple avec un Destructeur

<?php
class MyDestructableClass {
	function __construct() {
		print "In constructor\n";
		$this->name = "MyDestructableClass";
	}

	function __destruct() {
		print "Destruction de " . $this->name . "\n";
	}
}

$obj = new MyDestructableClass();
?>

Tout comme le constructeur, le destructeur parent ne sera pas appelé implicitement par le moteur. Pour exécuter le destructeur parent, vous devez appeler explicitement la fonction parent::__destruct dans le corps du destructeur. Tout comme les constructeurs, une classe enfant peut hériter du destructeur du parent s'il n'en implémente pas un lui même.

Le destructeur sera appelé même si l'exécution du script est stoppée en utilisant la fonction exit(). Appeler la fonction exit() dans un destructeur empêchera l'exécution des routines d'arrêt restantes.

Note:

Les destructeurs appelées durant l'arrêt du script sont dans une situation où les en-têtes HTTP ont déjà été envoyés. Le dossier de travail dans la phase d'arrêt du script peut être différent avec certaines APIs (e.g. Apache).

Note:

Tenter de lancer une exception depuis un destructeur (appelé à la fin du script) entraine une erreur fatale.

LoadingChargement en cours