Frage

Ich habe die folgende Klasse in PHP

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

Ich bin total über die Syntax zu verwenden

verwechselt

$MyMember = 0; und echo $MyMember

oder

private $MyMember = 0; und echo $MyMember

oder

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

Kann jemand mir sagen, wie es zu tun?

Ich bin ein bisschen nicht stark in OOPS.

Können Sie es in erster Linie zu tun?

Wenn nicht, wie soll ich das Mitglied erklären, so dass ich es in statischen Funktionen zugreifen kann?

War es hilfreich?

Lösung

class MyClass
{
  private static $MyMember = 99;

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

MyClass::MyFunction();

finden Sie unter Sichtbarkeit und Bereichsoperator (:. :) im oop5 Kapitel des pHP-Handbuch

Andere Tipps

Dies ist ein super späte Antwort, aber es kann jemand helfen ..

class MyClass
{
  private $MyMember;

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

Das funktioniert. Sie können die privaten Member auf diese Weise zugreifen, aber wenn Sie $ Klasse hatten, sollten Sie nur MyFunction eine Methode der Klasse machen, wie Sie nur $ nennen würde Klassen-> MyFunction (). Allerdings könnten Sie ein statisches Array haben, dass jede Instanz im Konstruktor der Klasse hinzugefügt wird, die diese statische Funktion zugreifen konnte und durchlaufen, alle Instanzen zu aktualisieren. dh ..

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

In statischen Methoden können Sie nicht variabel rufen mit $this da statische Methoden außerhalb eines „Instanz-Kontext“ genannt werden.

Es ist klar in der 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(); 

?>

Statische oder nicht-statische?

Haben Sie sich schon einmal gefragt, diese Frage?

  

Sie können nicht ohne statischen Parameter zuzugreifen / Methoden von innen   statische Methode (zumindest nicht ohne Abhängigkeitsinjektion verwendet)

     

Sie können jedoch Zugang statische Eigenschaften und Methoden mit in nicht-statische Methode (mit self::)

Eigenschaften

Gibt es bestimmte Eigenschaft Wert auf Klasse Plan assign ist oder vielmehr es Instanz (erstellte Objekt aus einer Klasse)? Wenn der Wert nicht fest an Klasseninstanz (Klassenobjekt) dann könnte man es als als statische Eigenschaft deklariert .

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

Methoden

Wenn über die Schaffung eines Verfahrens statischen oder nicht-statische entscheiden Sie brauchen, um sich eine einfache Frage zu stellen. Ist diese Methode zu verwenden $this müssen? Ist dies der Fall, dann sollte es nicht als statisch deklariert werden .

  

Und nur weil Sie nicht brauchen die $ dieses Schlüsselwort nicht   automatisch bedeuten, dass Sie etwas Statisches machen sollte (obwohl die   Gegenteil ist der Fall. Wenn Sie diesen $ brauchen, macht es nicht statisch)

Ruft Sie diese Methode auf einem einzelnen Objekt oder von der Klasse im Allgemeinen? Wenn Sie nicht sicher, welche zu benutzen, weil beide für bestimmten Anwendungsfall geeignet sind, dann verwenden Sie immer nicht statisch. Es wird Ihnen mehr Flexibilität in der Zukunft.

Gute Praxis ist immer dann starten Sie Ihre Klasse als nicht-statische und Kraft statisch zu entwerfen, wenn insbesondere wird wir Fall sehr klar.

Sie könnten versuchen, Ihre Parameter als statisch zu deklarieren ... nur so können Sie es aus statischer Methode zugreifen, aber das ist in der Regel nicht, was Sie tun wollen. Also, wenn Sie wirklich Zugang $this müssen aus statischen Methode, dann bedeutet es, dass Sie überdenken müssen / Redesign Ihrer Klasse Architektur , weil Sie nicht haben es falsch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top