Как получить доступ к приватному члену внутри статической функции в PHP - PullRequest
22 голосов
/ 24 декабря 2009

У меня есть следующий класс в PHP

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

Я совершенно не понимаю, какой синтаксис использовать

$MyMember = 0; и echo $MyMember

или

private $MyMember = 0; и echo $MyMember

или

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

Может кто-нибудь сказать мне, как это сделать?

Я немного не силен в OOPS.

Можете ли вы сделать это в первую очередь?

Если нет, то как мне объявить элемент, чтобы я мог получить к нему доступ внутри статических функций?

Ответы [ 4 ]

64 голосов
/ 24 декабря 2009
class MyClass
{
  private static $MyMember = 99;

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

MyClass::MyFunction();

см. Видимость и Оператор разрешения области действия (::) в главе oop5 руководства php.

9 голосов
/ 18 февраля 2011

Это супер поздний ответ, но он может помочь кому-то ..

class MyClass
{
  private $MyMember;

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

Это работает. Вы можете получить доступ к закрытому члену таким образом, но если у вас есть $ class, вы должны просто сделать MyFunction методом класса, как если бы вы просто вызывали $ class-> MyFunction (). Однако у вас может быть статический массив, к которому каждый экземпляр добавляется в конструктор класса, к которому эта статическая функция может обращаться и выполнять итерацию, обновляя все экземпляры. то есть ..

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;
    }
  }
}
2 голосов
/ 24 декабря 2009
<?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(); 

?>
2 голосов
/ 24 декабря 2009

В статических методах нельзя вызывать переменную, используя $this, потому что статические методы вызываются вне «контекста экземпляра».

Это четко указано в PHP документ .

...