FAQ PHP
FAQ PHPConsultez toutes les FAQ
Nombre d'auteurs : 68, nombre de questions : 580, dernière mise à jour : 18 septembre 2021
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 ();
&
#178;
?>
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
2
On 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'
);
?>