2009-12-24 17 views
18

je la classe suivante en PHPComment accéder à un membre privé à l'intérieur d'une fonction statique en PHP

class MyClass 
{ 
    // How to declare MyMember here? It needs to be private 
    public static function MyFunction() 
    { 
    // How to access MyMember here? 
    } 
} 

Je suis totalement confus dont la syntaxe à utiliser

$MyMember = 0; et echo $MyMember

ou

private $MyMember = 0; et echo $MyMember

ou

$this->MyMember = 0; et echo $this->MyMember

Quelqu'un peut-il me dire comment faire?

Je ne suis pas très fort en OOPS.

Pouvez-vous le faire en premier lieu?

Si non, comment dois-je déclarer le membre afin que je puisse y accéder à l'intérieur des fonctions statiques?

+0

connexes: [? pourrait membres statiques utiliser des membres non statiques et vice versa] (http://stackoverflow.com/q/2204128/367456) – hakre

Répondre

54
class MyClass 
{ 
    private static $MyMember = 99; 

    public static function MyFunction() 
    { 
    echo self::$MyMember; 
    } 
} 

MyClass::MyFunction(); 

voir Visibility et Scope Resolution Operator (::) dans le chapitre oop5 du manuel php.

+0

1 - Je ne savais pas moi mot-clé . votre code a fonctionné! merci :) –

1

Dans les méthodes statiques, vous ne pouvez pas appeler une variable en utilisant $this car les méthodes statiques sont appelées en dehors d'un "contexte d'instance".

Il est clairement indiqué dans le PHP doc.

1
<?php 
    class MyClass 
    { 
     // A) 
     // private $MyMember = 0; 

     // B) 
     private static $MyMember = 0; 

     public static function MyFunction() 
     { 
      // using A) // Fatal error: Access to undeclared static property: 
      //    MyClass::$MyMember 
      // echo MyClass::$MyMember; 

      // using A) // Fatal error: Using $this when not in object context 
      // echo $this->MyMember; 

      // using A) or B) 
      // echo $MyMember; // local scope 

      // correct, B) 
      echo MyClass::$MyMember; 
     } 
    } 

    $m = new MyClass; 
    echo $m->MyFunction(); 
    // or better ... 
    MyClass::MyFunction(); 

?> 
+0

Pouvez-vous appeler '$ m-> MyFunction();' comme ça si la fonction est statique? –

+0

oui vous pouvez, mais peut-être vous ne devriez pas, car il obscurcit le fait, que la fonction est liée à un objet .. – miku

+0

Bizarre. Je pensais que vous pouvez seulement appeler des fonctions statiques par ClassName :: FunctionName et non par instanciation. Quoi qu'il en soit, j'ai ce doute -> Si vous déclarez la variable comme dans le cas A) et l'utilisez comme 'echo $ MyMember', cela ne fonctionne pas pour moi. Cela ne devrait pas fonctionner correctement? Je suis incapable de comprendre votre commentaire - '// local' là. –

6

: une super réponse tardive, mais il peut aider quelqu'un ..

class MyClass 
{ 
    private $MyMember; 

    public static function MyFunction($class) 
    { 
    $class->MyMember = 0; 
    } 
} 

qui fonctionne. Vous pouvez accéder au membre privé de cette façon, mais si vous aviez $ class, vous devriez simplement faire de MyFunction une méthode de la classe, comme vous appelez simplement $ class-> MyFunction(). Cependant, vous pouvez avoir un tableau statique auquel chaque instance est ajoutée dans le constructeur de classe auquel cette fonction statique peut accéder et parcourir, en mettant à jour toutes les instances. à savoir ..

class MyClass 
{ 
    private $MyMember; 
    private static $MyClasses; 

    public function __construct() 
    { 
    MyClass::$MyClasses[] = $this; 
    } 

    public static function MyFunction() 
    { 
    foreach(MyClass::$MyClasses as $class) 
    { 
     $class->MyMember = 0; 
    } 
    } 
}