2010-05-30 1 views
0

Est-il possible de rendre toutes les variables de fonction globales sans les saisir toutes comme global $a, $b, $c...?Toutes les variables de fonction sont globales

+0

Ouch. C'est un anti-pattern, pensez à passer explicitement des variables aux fonctions/classes. – nuqqsa

+1

Pouvez-vous fournir un peu plus d'information sur pourquoi et dans quel scénario? Je me suis gratté la tête en essayant de comprendre pourquoi vous auriez une fonction centrale nécessitant des fonctions globales. – allnightgrocery

+4

@Inkspeak: Comment pourriez-vous écrire du code pour http://thedailywtf.com/? –

Répondre

1

Vous pouvez toujours utiliser $GLOBALS["var"] au lieu de $var. Bien sûr, si vous en avez besoin, vous vous trompez probablement.

3

Non. Ce serait une chose horrible à faire de toute façon.

+0

Pourquoi horrible? Tu peux le prouver? J'ai besoin de ceci pour ma seule fonction. –

+1

Vous en avez seulement besoin parce que le reste de votre design est nul. Que diriez-vous d'encapsuler toutes les données dont vous avez besoin dans un objet, au lieu de polluer l'espace des variables globales avec eux? –

+0

En ce qui concerne Matti, parlez-vous d'une méthode telle que mon post ci-dessus! – RobertPitt

2

Vous pouvez les transmettre comme arguments et vous aurez pas besoin du mot-clé global:

function(&$a, &$b, &$c) 
{ 
// your code........ 
} 
+3

Vous auriez à les passer par référence. – Artefacto

+0

@Artefacto. Bon appel. Mais l'OMI transforme les arguments en «paramètres externes», ce qui n'est pas mieux que d'utiliser les globaux en premier lieu. Et peut-être est-ce pire que si vous lisez la ligne qui appelle la fonction, vous n'avez aucune indication que le paramètre peut être modifié par la fonction. –

+0

@Juan Pablo Califano: D'accord sur ce point, pas de besoin réel et rapide pour cela, en utilisant le mot-clé global devrait être la voie à suivre. – Sarfraz

4

Essayez de créer un objet statique dans votre application et affectation de variables à cette portée, comme si!

<?php 
/* 
    * Core class thats used to store objects of ease of access within difficult scopes 
*/ 
class Registry 
{ 
    /* 
     * @var array Holds all the main objects in an array a greater scope access 
     * @access private 
    */ 
    private static $objects = array(); 

    /** 
     * Add's an object into the the global 
     * @param string $name 
     * @param string $object 
     * @return bool 
    */ 
    public static function add($name,$object) 
    { 
     self::$objects[$name] = $object; 
     return true; 
    } 

    /* 
     * Get's an object out of the registry 
     * @param string $name 
     * @return object on success, false on failure 
    */ 
    public static function get($name) 
    { if(isset(self::$objects[$name])) 
     { 
      return self::$objects[$name]; 
     } 
     return false; 
    } 

    /** 
     * Removes an object out of Registry (Hardly used) 
     * @param string $name 
     * @return bool 
    */ 
    static function remove($name) 
    { 
     unset(self::$objects[$name]); 
     return true; 
    } 

    /** 
     * Checks if an object is stored within the registry 
     * @param string $name 
     * @return bool 
    */ 
    static function is_set($name) 
    { 
     return isset(self::$objects[$name]); 
    } 
} 
?> 

Compte tenu de ce fichier est l'un des premiers fichiers inclus, vous pouvez définir un objet/tableau/variables/ressources/etc dans ce champ.

Disons donc que vous venez de faire une connexion DB, ceci est hwo vous l'utilisez

... 
$database = new PDO($dns); 

Registry::add('Database',$database); 

$DBConfig = Registry::get('Database')->query('SELECT * FROM config_table')->fetchAll(PDO::FETCH_CLASS); 
Registry::add('Config',$DBConfig); 

Non nulle part ailleurs au sein de votre script, vous pouvez ajouter ou récupérer des éléments.

avec Registry::get('ITEM_NEEDED');

Cela fonctionne dans les méthodes fonctions etc.

exemple parfait

function insertItem($keys,$values) 
{ 
    Registry::get('Database')->query('INSERT INTO items ('.implode(',',$keys).') VALUES ('.implode(',',$values).')'); 
} 

Hope it helps

+1

Je ne veux pas être impoli, mais cela a presque tous les problèmes d'utilisation de globals, sauf qu'il faut plus de frappe (ce qui semble être le principal problème pour l'OP). –

+0

C'est la façon dont je préfère faire les choses, si vous avez une meilleure solution, alors n'hésitez pas à le poster. – RobertPitt

+0

C'est bien et votre réponse est parfaitement valide. Je voulais simplement dire que se fier à l'état global pour transmettre des données peut devenir assez problématique. Je préfère utiliser des paramètres et renvoyer des valeurs. –