Pregunta

Tengo la clase siguiente 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 para 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 la clase de fuerte en el OOPS.

¿Puede hacerlo en el primer lugar?

Si no, ¿cómo debería declarar el miembro para que pueda acceder a ella dentro de funciones estáticas?

¿Fue útil?

Solución

class MyClass
{
  private static $MyMember = 99;

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

MyClass::MyFunction();

Visibilidad y Alcance del operador de resolución (: :). en el capítulo oop5 del manual de PHP

Otros consejos

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

class MyClass
{
  private $MyMember;

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

Eso funciona. Se puede acceder al miembro privado de esa manera, pero si usted tenía $ clase que sólo debe hacer MyFunction un método de la clase, como usted acaba de llamar de clase $> MyFunction (). Sin embargo, usted podría tener una matriz estática que cada instancia se añade al constructor de la clase en el cual esta función estática podría acceder y recorrer, la actualización de todos los casos. 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;
    }
  }
}

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

Se afirma claramente en el PHP doc .

<?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(); 

?>

estática o no estática?

¿Alguna vez se ha preguntado esta pregunta?

  

No se puede acceder a parámetros / métodos no estáticos desde el interior   método estático (al menos no sin utilizar la inyección de dependencia)

     

Sin embargo, puede acceder a las propiedades y métodos estáticos de con en método no estático (con self::)

Propiedades

¿Tiene valor particular propiedad se asigna al plan de clase o mejor dicho a ella instancia (objeto creado a partir de una clase)? Si el valor no es firme a instancia de clase (clase de objeto) entonces se podría declarar como una propiedad estática .

private static $objectCreatedCount; // this property is assign to class blueprint
private $objectId; // this property is assign explicitly to class instance

Métodos

Cuando se decide en hacer un método estático o no estática que necesita para hacerse una pregunta simple. ¿Este método necesita utilizar $this? Si lo hace, entonces no debería ser declarado como static .

  

Y el hecho de que no es necesario el $ esta palabra clave no lo hace   significa automáticamente que usted debe hacer algo estático (aunque el   ocurre lo contrario:. si necesita $ this, que sea no estático)

¿Está llamando a este método en un objeto individual o en la clase en general? Si no está seguro de cuál usar porque ambos son especialmente apropiados para casos de uso, a continuación, utilizar siempre no estático. Se le dará una mayor flexibilidad en el futuro.

Una buena práctica es siempre empezar a diseñar su clase como no estática y fuerza estática si el caso particular que nos llegan a ser muy clara.

Usted podría intentar declarar sus parámetros como estática ... sólo para que pueda acceder a él desde el método estático, sino que por lo general no es lo que quiere hacer. Así que si realmente necesita acceder $this del método estático, entonces significa que es necesario reconsiderar / rediseñar su arquitectura de alta calidad porque hay que ponerse mal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top