Citation :
cali76 a écrit:
function &getObjects($criteria = null)
{
$ret = array();
$limit = $start = 0;
$sql = 'SELECT * FROM '.$this->db->prefix('weblinks_options');
if (isset($criteria) && is_subclass_of($criteria, 'criteriaelement'))
{
$sql .= ' '.$criteria->renderWhere();
$sort = ($criteria->getSort() != '') ? $criteria->getSort() : 'option_id';
$sql .= ' ORDER BY '.$sort.' '.$criteria->getOrder();
$limit = $criteria->getLimit();
$start = $criteria->getStart();
}
$result = $this->db->query($sql, $limit, $start);
if (!$result)
{
return $ret;
}
while ($myrow = $this->db->fetchArray($result))
{
$option = new weblinksOption();
$option->assignVars($myrow);
$ret[] =& $option;
unset($option);
}
return $ret;
}
Alors j'ai fait 2 3 tests sur le unset dans ce genre de boucle car pour moi l'interet logique du truc est inexistant...
Je m'explique... Unset sert a liberer la memoire, mais au final unset ne libere pas la memoire immediatement, ca detache ta variable de la zone de memoire utilise, cette zone de memoire tombe dans un garbage collector façon java et ensuite a un moment ca va etre nettoye...
Premier point : du coup a quoi sert le unset($option) dans la boucle vue que de toutes façons tu rattaches a chaque fois ton $option a une nouvelle adresse et donc automatiquement ton ancienne zone memoire n'est plus 'attache'.
Second point : la donnee de toutes façon n'est pas nettoye vu que tu l'as mise dans ton tableau normalement (enfin c la logique) donc ce que tu liberes au final c juste un pointeur.
Alors ca c la logique
Dans la pratique ce qui est tres rigolo c'est que si tu ne fais pas le unset tu vas te retrouver a la fin avec un tableau contenant le bon nombre de donnee mais pointant toutes sur la meme chose c-a-d un tabelau rempli de la meme ligne... ce qui est tres bizarre. C'est comme si au final le New n'avait pas alloue reellement un nouvel objet (nouveau pointeur) mais reutilise l'ancien.
Ensuite d'apres mes tests en PHP 5 ca peut marcher si tu evites de mettre le &
while ($myrow = $this->db->fetchArray($result))
{
$option = new weblinksOption();
$option->assignVars($myrow);
$ret[] = $option;
}
unset($option);
alors que si tu laisses le & ca marche pas. Alors que en toute logique d'apres ce que j'ai pu lire en php 5 que l'on mette le & ou pas c'est pareil... ben en pratique non
(j'ai pas teste la difference sur le 4 mais normalement en 4 ca fonctionne pas avec ce code...)
Voila ca c pour le unset...
Maintenant question bete a quoi sert ta variable option? et du coup le unset($option)
$i = 0;
while ($myrow = $this->db->fetchArray($result))
{
$ret[$i] = new weblinksOption();
$ret[$i++]->assignVars($myrow);
}
c pas mieux ainsi?... et ca devrait fonctionner a priori...
Sinon comme l'a indique William au dessus il y a une classe deja existante pour la selection des pays formselectcountry.php.