2010-03-13 4 views
2

Je me demande si quelqu'un peut aider ici, j'essaie de comprendre comment utiliser une propriété d'objets à travers plusieurs pages non classe, mais je ne peux pas sembler être en mesure de comprendre tout ce que je ont essayé jusqu'ici.php variable scope dans oop

Par exemple une classe appelée personne;

class person { 
static $name;  
} 

mais j'ai un certain nombre de pages régulières qui veulent utiliser $name dans tous les domaines.

J'ai essayé des choses comme ça;

pageone.php

include "person.php"; 
$names = new Person(); 

echo person::$name; 
names::$name='bob'; 

pagetwo.php

include "person.php"; 
echo person::$name; 

Je peux travailler avec des classes dans la mesure où je suis OK tant que je suis en train de créer de nouvelles instances chaque page, mais comment rendre les propriétés d'un objet accessibles à tous, comme une variable partagée?

Merci

Répondre

3

Chaque nouvelle instance d'un script PHP "oublie" tout fait dans les scripts précédents. La manière habituelle d'établir une "salle de stockage" pour les données sur les chargements de pages est les sessions. Une session est essentiellement un identifiant spécifique qu'un utilisateur obtient en visitant une page. Cet ID est stocké dans un cookie ou une variable GET qui est ajoutée à chaque URL. PHP conserve les fichiers texte dans un répertoire spécial qui peut contenir des données spécifiques à la session. Chaque fichier est nommé en utilisant l'identifiant de session.

Le manuel PHP a un thorough introduction ici.

pageone.php 

session_start(); 
$_SESSION["name"] = "Bob", 

pagetwo.php 

session_start(); 

echo $_SESSION["name"]; // Bob 

Maintenant, si vous aviez un objet instancié, vous pourriez serialize, la stocker dans une variable de session et désérialisable de retour dans la 2ème page. Je ne pense pas que cela puisse être fait avec des classes statiques. Mais cela devrait être un bon début.

+0

@Pekka: les instances n'ont pas besoin d'être sérialisées. La session PHP fait d'habitude déjà la sérialisation automatique, selon le paramètre d'ini: 'session.serialize_handler = php' –

+0

Merci, je regarderai en utilisant des vars de session –

0

Vous devez initialiser la variable statique dans la déclaration de la classe elle-même:

class Person { 
    public static $name = 'bob'; 
} 

Ou, vous avez besoin d'un mécanisme de bootstrapping, où vous inititalize la variable statique:

bootstrap.php:

Person::$name = 'bob'; 

puis dans les pages:

// assuming, you preloaded the bootstrap somewhere first 
$person = new Person(); 

echo $ personne :: $ name;

modifier
Ugh, ce que je pensais ... ce qui précède vont même pas travailler. Vous ne pouvez pas accéder à un membre statique comme celui d'une instance.Seule une méthode, comme ceci:

class Person 
{ 
    public static $name; 

    public function getName() 
    { 
     return self::$name; 
    } 

} 

// assuming, you preloaded the bootstrap somewhere first 
$person = new Person(); 
echo $person->getName(); 

/modifier fin

Ou comme Pekka a souligné, des séances d'utilisation pour garder l'état.

Mais plus important encore: quel est l'objectif que vous essayez d'atteindre? Si vous souhaitez conserver l'état d'un objet Personne entre différentes requêtes, alors l'itinéraire de Pekka est le chemin à parcourir, ou utilisez un autre mécanisme de stockage de persistance, comme un DB, un fichier, etc ... Ne veux-tu pas avoir chaque instance de Person nommée 'bob'? Je présume que vous voulez maintenir l'état d'une seule instance de personne. Donc, en conclusion, vous ne voulez probablement pas utiliser un membre statique pour commencer.

+0

merci, il semble que j'ai besoin d'utiliser des sessions. Le code ci-dessus était plus d'un exemple - je commençais à être un peu confus sur OOP, je pensais qu'une fois que vous créez une instance d'un objet - il est assis en mémoire, avec toutes ses propriétés. J'essayais de comprendre comment accéder aux propriétés d'une instance sur différentes pages php régulières. –