FAQ PHPConsultez toutes les FAQ

Nombre d'auteurs : 68, nombre de questions : 580, dernière mise à jour : 29 juillet 2013 

 
OuvrirSommaireClasses et objetsPHP 4

En PHP 4, si les objets peuvent posséder un constructeur, il n'a pas été prévu dans l'implémentation du langage de méthode destructeur.
Voici deux façons de détruire un objet en simulant une méthode destructeur.

Exemple 1 :

 
Sélectionnez
<?php
function DestroyObject ($name){
    $theobject = &$GLOBALS[$name];
    if (method_exists ($theobject,"Destroy"))
        $theobject->Destroy ();
    unset ($GLOBALS[$name]);
}

class xyz{
    var $somevar;

    // ### Constructeur
    function xyz (){
    }

    // ### Méthode Destructeur
    function Destroy (){
        echo ("Destruction d'un objet!");
        // ici du code qui va fermer proprement la connexion à une BDD, écrire dans un fichier, etc...
    }

    function SomeDo (){
        echo ("On fait quelquechose: ".$this->somevar);
    }
}

$example = new xyz;

$example->somevar = 3;
$example->SomeDo();

DestroyObject ("example");

// ### Il devrait y avoir une erreur
$example->SomeDo ();

?>

Exemple 2: utilisation de la méthode prédéfinie __sleep() et de la fonction serialize()

 
Sélectionnez
<?php
class xyz {
    var $somevar;

    // ### Constructeur
    function xyz (){
    }

    // ### Méthode Destructeur
    function __sleep (){
        echo ("Destruction d'un objet!");
        // ici du code qui va fermer proprement la connexion à une BDD, écrire dans un fichier, etc...
        return array(); // on doît nécéssairement retourner un tableau, même vide
    }

    function SomeDo (){
        echo ("On fait quelquechose: ".$this->somevar);
    }
}

$example = new xyz;

$example->somevar = 3;
$example->SomeDo();

serialize($example);
unset($example);

// ### Il devrait y avoir une erreur
$example->SomeDo ();
²
?>
Mis à jour le 4 août 2008  par vdemeester, Jérôme

Les attributs static, dans les versions antécédentes à PHP 5 ne sont pas intégrés à PHP. Pourtant il y a un moyen de les simuler.

 
Sélectionnez
class B{
    var $compteur; // variable à priori static qui va compter combien d&#39;objet ont été créés...
    
    function B(){
        static $compteur; // déclarée en statique
        $this->compteur =& $compteur; // passage en référence
        (int) $this->compteur++; // j&#39;incrémente cette variable
    }
}

$B_test = new B(); // le compteur est incrémenté de 1
echo $B_test->compteur . "<br />";
$B_test1 = new B(); // le compteur est incrémenté de 1 donc devient 2
echo $B_test1->compteur . "<br />";
echo $B_test->compteur . "<br />";

Ce qui va générer la sortie suivante :

 
Sélectionnez
1
2
2

On a bien simulé un attribut statique (ici il compte le nombre d'objets mais on peut imaginer d'autres utilisations).

Mis à jour le 4 août 2008  par vdemeester

La réponse est oui. Il faut tout de même savoir que les déclarations des différentes classes doivent être faites avant l'appel à session_start lorsque l'objet fait partie de la session courante (comprenez qu'il a été enregistré). Les déclarations des classes peuvent être chargées manuellement (fonctions require ou include) ou automatiquement (fonction magique __autoload). En voici un exemple pour illustrer :

 
Sélectionnez
class Utilisateur
{
    var $identifiant;
    var $login;
    
    function Utilisateur($id, $login)
    {
        $this->identifiant = $id;
        $this->login = $login;
    }
    
    function getLogin()
    {
        return $this->login;
    }
    
    function getIdentifiant()
    {
        return $this->identifiant;
    }
}

Enregistrement dans la session :

 
Sélectionnez
session_start();
require_once('utilisateur.class.php'); // Peut être effectué avant comme après session_start()
 
$_SESSION['util'] = new Utilisateur(1, 'toto');

Et enfin, utilisation des données de la session :

 
Sélectionnez
require_once('utilisateur.class.php'); // Déclaration impérativement avant session_start()
session_start();

if (isset($_SESSION['util']))
{
    echo 'Bonjour ' . $_SESSION['util']->getLogin();
}
Remarques :
  • Les attributs de type ressource ne sont pas sérialisables (une connexion à une base de données par exemple) ;
  • Si la session est démarrée automatiquement (directive session.auto_start positionnée à 1), vous n'arriverez pas à utiliser directement des objets puisque les classes ne pourront être connues.
Créé le 6 juin 2007  par Julp

Lien : Tutoriel : Les sessions en PHP, par julp et Mathieu Lemoine
Lien : Comment sauvegarder une variable dans une session ?

Avant sa version 5, PHP proposait seulement un modèle pseudo-objet qui ne propose ni constructeur ni destructeur réels.

Le code suivant est valide à la fois PHP4 et PHP5 :
Sélectionnez
<?php
/*
** Toutes les classes doivent étendre cette classe
*/
class _model_
{
    /*
    ** En PHP4, le constructeur a le nom de la classe.
    ** Etant donné que func_get_args() copie les paramètres (et donc ne garde pas les références),
    ** on utilise une astuce nécessitant des paramètres définis, mais pas forcément utilisés.
    */
    function _model_($arg1 = NULL, $arg2 = NULL, $arg3 = NULL, $arg4 = NULL, $arg5 = NULL, $arg6 = NULL, $arg7 = NULL, $arg8 = NULL, $arg9 = NULL, $arg10 = NULL, $arg11 = NULL, $arg12 = NULL)
    {
        // Déclaration du destructeur
        register_shutdown_function(array(&$this, '__destruct'));

        $total = func_num_args();
        if (!$total)
        {
            $this->__construct();
        }
        else
        {
            // Procédure visant à garder les références des arguments
            $args = $pass = array();
            for ($i = 1; $i <= $total && $i <= 12; $i++)
            {
                $args[] = &${'arg' . $i};
                $pass[] = '$arg' . $i;
            }

            // Appel du constructeur PHP5 manuellement en PHP4
            eval('$this->__construct(' . implode(', ', $pass) . ');');
        }
    }

    /*
    ** En PHP5, __construct() devient le constructeur prioritaire
    */
    function __construct()
    {
    }

    /*
    ** Destructeur PHP5, appelé via register_shutdown_function pour PHP4
    */
    function __destruct()
    {
    }

    /*
    ** Affichage intelligent d'un objet, valable uniquement pour PHP5
    */
    function __toString()
    {
        $str = '<b>Classname :</b> ' . get_class(&$this) . '<br />';
        $str .= '<b>Properties :</b><ul style="margin: 0">';
        foreach ($this AS $property => $value)
        {
            $str .= '<li><b>' . $property . '</b> = <pre style="display: inline">' . var_export($value, TRUE) . '</pre></li>';
        }
        $str .= '</ul>';
        
        return ($str);
    }

    /*
    ** Affectation de propriété
    */
    function __set($property, $value)
    {
        $this->$property = $value;
    }

    /*
    ** Valeur d'une propriété
    */
    function __get($property)
    {
        if (property_exists(&$this, $property))
        {
            return ($this->$property);
        }
        return (NULL);
    }
}

/*
** Implémentation du clonage d'objet en PHP4
*/
if (version_compare(phpversion(), '5.0') < 0)
{
    eval('function clone($object){return($object);}');
}
?>
Exemple d'utilisation :
Sélectionnez
<?php
include('class/model.php');

class Database extends _model_
{
    var $id;

    function __construct($server, $login, $pass, $database)
    {
        $this->id = mysql_connect($server, $login, $pass);
        mysql_select_db($database)
    }

    function query($sql)
    {
        return (mysql_query($sql) OR die(mysql_error()));
    }

    function __destruct()
    {
        mysql_close($this->id);
    }
}

$db = new Database('localhost', 'root', '', 'dvp');
$db->query('SELECT * FROM ma_table');
?>
Créé le 27 juillet 2007  par genova
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2003 Developpez.com Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.