2009-12-24 18 views
18

tengo la siguiente clase en PHPcómo acceder a un miembro privado dentro de una función estática en PHP

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

estoy totalmente confundido acerca de qué sintaxis conviene utilizar

$MyMember = 0; y echo $MyMember

o

private $MyMember = 0; y echo $MyMember

o

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

¿Puede alguien decirme cómo hacerlo?

No soy fuerte en OOPS.

¿Se puede hacer en primer lugar?

En caso negativo, ¿cómo debo declarar el miembro para que pueda acceder a él dentro de las funciones estáticas?

+0

relacionadas: [? podría estática miembros a usar los miembros no estáticos y viceversa] (http://stackoverflow.com/q/2204128/367456) – hakre

Respuesta

54
class MyClass 
{ 
    private static $MyMember = 99; 

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

MyClass::MyFunction(); 

ver Visibility y Scope Resolution Operator (::) en el capítulo oop5 del manual de PHP.

+0

1 - Yo no sabía acerca de la auto palabra clave . tu código funcionó! gracias :) –

1

Dentro de los métodos estáticos, no puede llamar a la variable usando $this porque los métodos estáticos se llaman fuera de un "contexto de instancia".

Está claramente establecido en el 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

¿Puedes llamar '$ m-> MyFunction();' así si la función es estática? –

+0

sí, puede, pero tal vez no deberías, ya que oscurece el hecho de que la función está ligada a un objeto. – miku

+0

Extraño. Pensé que solo puedes invocar funciones estáticas por ClassName :: FunctionName y no crear instancias. De todos modos, tengo esta duda -> Si declaras la variable como en el caso A) y la usas como 'echo $ MyMember', no me funciona. No debería funcionar bien? No puedo entender tu comentario - '// local' allí. –

6

Esta es una respuesta super tarde pero puede ayudar a alguien ..

class MyClass 
{ 
    private $MyMember; 

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

que funciona. Puede acceder al miembro privado de esa manera, pero si tuviera $ clase, debería simplemente hacer que MyFunction sea un método de la clase, ya que solo llamaría a $ class-> MyFunction(). Sin embargo, podría tener una matriz estática a la que se agregue cada instancia en el constructor de la clase a la que esta función estática podría acceder y repetir, actualizando todas las instancias. es decir ..

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; 
    } 
    } 
} 
Cuestiones relacionadas