2010-07-16 3 views
0

Possible en double:
Access global variable from within a classComment atteindre "GLOBALS" à l'intérieur d'une classe en PHP

I GOT le code suivant:


$foo = 'foo'; 

class bar 
{ 
    public function __construct() 
    { 
     var_dump($foo); 
    } 
} 

$bar = new bar(); 

Il en résulte une Valeur NULL Est-il possible d'atteindre $ foo dans la barre de classe? avec un mot magique fantaisie en php?

+0

* (liés) * [Le meilleur moyen d'accéder à des objets globaux (comme base de données ou Log) des classes et des scripts?] (Http : //stackoverflow.com/questions/1967548/best-way-to-access-global-objects-like-database-or-log-from-classes-and-scripts) – Gordon

Répondre

3
global $foo; 
var_dump($foo); 

Voir http://www.ideone.com/OOAsg.

(Pourquoi ne pas passer un argument?)

+0

C'est un grand flux de cours et ça devient agaçant pour le faire circuler tout le temps. Merci pour la suggestion! – Emil

+1

C'est une mauvaise excuse. Passez un objet ou un tableau si vous devez passer trop de choses. – Naktibalda

+1

Et n'est-il pas ennuyeux de déboguer quand une classe va parfois changer les données? Ou déboguer lorsque les objets ont été instanciés dans le mauvais ordre? – zerkms

4

Oui, le mot magique est appelé un argument

class bar 
{ 
    public function __construct($foo) 
    { 
     var_dump($foo); 
    } 
} 
$foo = 'foo'; 
$bar = new bar($foo); 

Vous ne voulez pas le mot-clé global dans votre code. Les fonctions (et méthodes) doivent être des unités testables isolées. Si vous utilisez le mot clé global, vous créez effectivement une dépendance sur la portée globale dans la portée de la fonction. Il est préférable et plus facile d'injecter des dépendances à travers des arguments.

1

Si vous tentez d'accéder à un objet de base de données, vous voudrez peut-être jeter un œil au Singleton Pattern. En outre, vous pouvez penser à utiliser un registre:

class R { 
    public static $foo; 
    public static $db; 
    public static $user; 
    // ... 
} 
// later in code 
R::$db = new PDO(...); 
R::$user = new User(); 
// ... 

Et vous pouvez accéder à ces variables toujours et de partout (y compris les classes, les fonctions et l'espace global.)

(D'accord, je sais que ce n'est pas un vrai Registre avec get et set méthodes, mais je pense que c'est assez ...)

+1

Bien que l'on devrait noter que le registre et (en particulier) Singleton sont des modèles controversés, car ils introduisent une dépendance sur la portée mondiale aussi. – Gordon

+0

Bien sûr. Mais c'est plus facile que de contourner une dizaine de variables;) – NikiC

+0

@nikic comment cela est-il différent de faire globalarregateArray alors? – Gordon

1

Emil - s'il vous plaît prendre le conseil ici et ne soyez pas paresseux sur garder votre code autonome. Bien sûr, il arrivera un moment où le système se mettra en vrille sur des variables référencées en arrière qui sont utilisées de diverses façons dans différentes parties du programme.

alors il y a la question de l'instanciation d'instance. Comment pouvez-vous raisonnablement suivre l'ordre dans lequel les nouvelles classes seront appelées et l'effet que cela pourrait avoir sur votre var global?

que le fait que vous pourriez finir par négliger le but de la variable plus tard dans le développement et l'utiliser pour autre chose conduira juste à une multitude d'impasses.

en un mot - ne le faites pas pour le bien de votre santé mentale en 2 mois de temps ...

jim

0

c'est ainsi que je l'ai résolu.Il a vraiment effacé tous mes problèmes


class bar 
{ 
    public static $foo; 
} 

$bar::foo = 'foo'; 

Merci pour toutes vos réponses

+0

Emil - si vous devez vraiment le faire de cette façon, alors dites-moi s'il vous plaît que ceci est utilisé pour des informations de type 'config' plutôt statiques et pas de données dépendantes des transactions ... ne prenez pas ceci comme une hostilité :) –

+0

Êtes-vous sûr que votre code fonctionne? '$ bar :: foo' devrait normalement accéder à la constante' foo' * de la classe, * qui est dans la variable '$ bar' *. Peut-être que vous vouliez dire 'bar :: $ foo'? – NikiC

0
$foo = 'foo'; 
class bar 
{ 
    public function __construct() 
    { 
    // pay attention to "global" 
    global $foo; 
     var_dump($foo); 
    } 
} 
$bar = new bar();