FAQ PHP

FAQ PHPConsultez toutes les FAQ
Nombre d'auteurs : 68, nombre de questions : 580, dernière mise à jour : 18 septembre 2021
 Sommaire→Classes et objets→PHP 4
Sommaire→Classes et objets→PHP 4En 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 ();
²
?>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'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'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
2On a bien simulé un attribut statique (ici il compte le nombre d'objets mais on peut imaginer d'autres utilisations).
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();
}- 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 : 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.
<?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);}');
}
?><?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');
?>



