2011-08-04 2 views
1

j'ai écrit une fonction pour afficher un objet sur chaque poste wordpress:Comment éviter d'appeler plusieurs fois une fonction dans ce cas?

function pod(){ 
global $post,$pod; 
$id = get_the_ID(); 
$pod = new WP_POD($id); 
return $pod; 
} 

Je pensais que pod $ est global, donc, je peux utiliser pod- $> étoffes en cas de besoin, mais il ne fonctionne pas. Ainsi, dans chaque fonction que je dois utiliser des étoffes dans l'objet, je dois ajouter une ligne:

$pod = pod() 

Je pense appeler à plusieurs reprises cette fonction peut-être pas bon pour performence. Y a-t-il un moyen de rendre cela global et accessible par d'autres fonctions?

Répondre

1

vous voulez t o avoid the global keyword. Si vous devez insérer des données dans une fonction, c'est un signe certain que votre design est cassé (et Wordpress est cassé). Utilisez Dependency Injection et passer $ post et pod $ à la fonction (qui empêchera également spooky action at a distance):

function pod($post, $pod) 
{ 
    $id = get_the_ID(); 
    $pod = new WP_POD($id); 
    return $pod; 
} 

Toutefois, cela ne marche pas encore beaucoup de sens. Vous n'utilisez pas $ post dans la fonction, alors pourquoi le transmettre? Au lieu de cela, vous atteignez à nouveau la portée de la fonction pour récupérer une sorte d'identifiant. Et vous l'utilisez pour instancier une instance de WP_POD et l'assigner à la portée globale.

Pourquoi assignez pas seulement faire

function createPod($id) 
{ 
    return new WP_POD($id); 
} 

puis appelez avec

$pod = createPod(get_the_ID()); 

ou tout simplement supprimer la fonction tout à fait et il suffit de faire

$pod = new WP_POD(get_the_ID()); 

Oui, ce wont le $ pod instance à la portée mondiale, mais je doute que vous en avez vraiment besoin là de toute façon. En ce qui concerne les performances: vous ne devriez pas vous soucier des performances, sauf si vous avez profilé votre application et constaté qu'elle est lente et que ce code particulier est en effet la raison de sa lenteur.

+0

Merci beaucoup pour l'explication détaillée! Je pensais que le global est une chose convinienc, maintenant je vois qu'il pourrait ne pas. Il n'y a pas de ralentissement sur mon site, je pense juste qu'il est agréable d'utiliser moins de codes, ne semble pas nécessaire :-) – Jenny

0

Vous devez supprimer $ pod comme global dans la fonction à partir de laquelle vous essayez d'accéder à la variable. Les variables ne sont pas accessibles globalement à moins d'être explicitement déclarées en PHP contrairement à la plupart des autres langages.

pod Call() une fois

accès alors comme cette

global $pod; 
$pod->stuffs .... 
1

Vous pouvez simplement passer l'objet aux fonctions que vous appelez.
Ou utiliser quelque chose d'autre lié à http://en.wikipedia.org/wiki/Dependency_injection

Ou, si cela ne vous convainc pas ;-), au moins limiter la visibilité de la variable par quelque chose comme

function pod($init=false) { 
    global $post,$pod; 
    static $pod=null; 
    if (is_null($pod) || $init) { 
     $id = get_the_ID(); 
     $pod = new WP_POD($id); 
    } 
    return $pod; 
} 

voir http://docs.php.net/language.oop5.static

0

vous pouvez utiliser $ GLOBALS pour déclarer la variable dans votre script:

$pod = new WP_POD(get_the_ID()); 

function myFunc() { 
    $GLOBALS['pod']->aMethod; 
} 
Questions connexes