2009-12-24 10 views
18

ho la seguente classe in PHPCome accedere un membro privato all'interno di una funzione statica in PHP

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

Sono totalmente confuso su quale sintassi da utilizzare

$MyMember = 0; e echo $MyMember

o

private $MyMember = 0; e echo $MyMember

o

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

qualcuno può dirmi come fare?

Sono una specie di non forte in OOPS.

Puoi farlo in primo luogo?

In caso contrario, come dovrei dichiarare il membro in modo che possa accedervi all'interno di funzioni statiche?

+0

correlati: [? potrebbe elettricità statica membri utilizzano membri non statici e viceversa] (http://stackoverflow.com/q/2204128/367456) – hakre

risposta

54
class MyClass 
{ 
    private static $MyMember = 99; 

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

MyClass::MyFunction(); 

vedere Visibility e Scope Resolution Operator (::) nel capitolo oop5 del manuale php.

+0

1 - non sapevo di sé parola chiave . il tuo codice ha funzionato! grazie :) –

1

All'interno dei metodi statici, non è possibile chiamare la variabile utilizzando $this poiché i metodi statici vengono chiamati all'esterno di un "contesto dell'istanza".

È chiaramente indicato nello 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

Puoi chiamare '$ m-> MyFunction();' come se la funzione fosse statica? –

+0

sì è possibile, ma forse non si dovrebbe perché oscura il fatto, che la funzione è legata all'oggetto .. – miku

+0

Strano. Ho pensato che puoi chiamare le funzioni statiche solo da ClassName :: FunctionName e non dall'istanza. Comunque, ho questo dubbio -> Se dichiari la variabile come nel caso A) e usala come "echo $ MyMember", non funziona per me. Non dovrebbe funzionare bene? Non riesco a capire il tuo commento - '// local' lì. –

6

Questa è una risposta super tardi ma può aiutare qualcuno ..

class MyClass 
{ 
    private $MyMember; 

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

che funziona. Puoi accedere al membro privato in questo modo, ma se avessi $ classe dovresti semplicemente rendere MyFunction un metodo della classe, come si chiamerebbe $ class-> MyFunction(). Tuttavia si potrebbe avere una matrice statica a cui ogni istanza viene aggiunta nel costruttore della classe che questa funzione statica potrebbe accedere e iterare attraverso, aggiornando tutte le istanze. cioè ..

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; 
    } 
    } 
} 
Problemi correlati