Accueil
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi Eclipse MS-Office SQL & SGBD Oracle  4D  Business Intelligence
logo
Sommaire > Classes et objets > PHP 4
        Comment détruire explicitement un objet en PHP 4 ?
        Comment simuler les propriétés (attributs) statiques en PHP4 ?
        Les objets font-ils bon ménage avec les sessions en PHP 4 ?
        Comment utiliser des constructeurs et déstructeurs en PHP4 ?



Comment détruire explicitement un objet en PHP 4 ?
auteurs : vdemeester, Jérôme
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 :
<?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()
<?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 ();
²
?>

Comment simuler les propriétés (attributs) statiques en PHP4 ?
auteur : vdemeester
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.
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 :
1
2
2
On a bien simulé un attribut statique (ici il compte le nombre d'objets mais on peut imaginer d'autres utilisations).


Les objets font-ils bon ménage avec les sessions en PHP 4 ?
auteur : Julp
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 :
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 :
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 :
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.
lien : fr Tutoriel : Les sessions en PHP, par julp et Mathieu Lemoine
lien : faq Comment sauvegarder une variable dans une session ?

Comment utiliser des constructeurs et déstructeurs en PHP4 ?
auteur : genova
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 :
<?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 :
<?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');
?>


Consultez les autres F.A.Q.


Les sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2003  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'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com