2010-01-05 8 views
1

J'essaye d'écrire une fonction qui retournera une référence à un objet PDO. La raison de vouloir une référence est si, pour une raison quelconque, l'objet PDO est appelé deux fois dans un chargement de page, il retournera simplement le même objet plutôt que d'en initialiser un nouveau. Ce n'est pas stupide, n'est-ce pas? :/Fonction PHP pour retourner une référence à une variable

function &getPDO() 
{ 
    var $pdo; 

    if (!$pdo) 
    { 
     $pdo = new PDO... 

     return $pdo; 
    } 
    else 
    { 
     return &pdo; 
    } 
} 

Quelque chose comme ça

+0

'' retour &$pdo; est une erreur de syntaxe. Vous devriez faire 'return $ pdo; Le signe '&' n'est utilisé que dans la déclaration de la fonction et non lorsque vous la renvoyez. – Pacerier

Répondre

1

Pour faire référence à une variable de $foo, faites ceci:

$bar =& $foo; 

Puis return $ bar.

3

Utilisez static $pdo;.

function getPDO() 
{ 
    static $pdo; 

    if (!$pdo) 
    { 
     $pdo = new PDO... 
    } 

    return $pdo; 

} 
+0

Merci à vous et tous les autres gars ci-dessous ce commentaire pour l'aide. Alors cette fonction renverra une référence à la variable sans avoir besoin de l'esperluette? – dave

+0

@dave, sans l'esperluette, elle ne renverra pas de * référence *. Ce qu'il retourne est une copie de l'identifiant d'objet http://php.net/manual/fr/language.oop5.references.php – Pacerier

2

Les objets sont toujours passé par référence en PHP. Par exemple:

class Foo { 
    public $bar; 
} 

$foo = new Foo; 
$foo->bar = 3; 
myfunc($foo); 
echo $foo->bar; // 7 

function myfunc(Foo $foo) { 
    $foo->bar = 7; 
} 

Seuls les non-objets (scalaires, tableaux) sont transmis par valeur. Voir References Explained.

Par rapport à votre fonction, vous devez rendre la variable statique. var est en PHP 5. dépréciée donc:

function getFoo() { 
    static $foo; 
    if (!$foo) { 
    $foo = new Foo; 
    } 
    return $foo; 
} 

Pas esperluette nécessaire.

Voir aussi Objects and references.

+0

** Pas vrai **, ce qui est passé est une copie de leur identifiant et non une référence . Le lien que vous avez lié explique dans le premier para ... – Pacerier

0

Vous écririez comme ça

 
function getPDO() 
{ 
    static $pdo; 

    if (!$pdo) { 
     $pdo = new PDO... 
    } 

    return $pdo; 
} 
Questions connexes