Вызовы открытых переменных класса, совместимые в PHP 7.0 и PHP 5.6

В PHP 5.6:

Находясь внутри класса, мы обычно объявляем и вызываем переменную открытого класса следующим образом:

class MyClass
{
    /**
     * @var int
     */
    public $myVar = 0;

    // call it in a public function:
   public function myFunction()
   {
       return $this->myVar;
   }

}

Я называю функцию так:

MyClass::myFunction();

В PHP 7.0 этот код вызывает фатальную ошибку:

Использование $ this, когда не в контексте объекта

После того, как я снова изменил версию PHP на 5.6, ошибка исчезла.

Вопросы:

Я должен признать, что после прочтения руководства и изменения с 5.6 до 7.0 я не понимаю.

  1. Как мы объявляем и вызываем переменные открытого класса в PHP 7.0?
  2. Как мы пишем этот код, чтобы быть совместимым между 5.6 и 7.0?

Редактировать после комментариев:

Так почему же статический вызов нестатического метода работает в 5.6?

3 ответа

Решение

Я загружаю, может быть, func() вот так:

 obj::func();  // Wrong, it is not static method

но также может быть

$obj = new Obj();  // correct
$obj->func();

Вы не можете вызывать метод таким образом, потому что это не статический метод.

obj::func();

Вместо этого вы должны использовать:

obj->func();

Однако если вы создали статический метод что-то вроде:

static $foo; // your top variable set as static

public static function foo() {
    return self::$foo;
}

тогда вы можете использовать это:

obj::func();

Поведение, которое вы описываете, можно найти в следующем примере:

<?php

class MyClass
{
  /**
   * @var int
   */
  public $myVar = 1;

  // call it in a public function:
  public function myFunction()
  {
    return $this->myVar;
  }    
}

class MyClass2
{
  /**
   * @var int
   */
  public $myVar = 2;

  public function test()
  {
    echo MyClass::myFunction();
    // outputs: 2
  }
}


$obj = new MyClass2();
$obj->test();
?>

В PHP 5 вы можете вызывать открытый метод других классов, когда вы находитесь внутри экземпляра. Он будет работать как член класса в текущем контексте $this. PHP 7 более строгий. Вы можете расширять классы или импортировать признаки в классы в разных строках наследования. Нет необходимости использовать методы других классов. Вы все еще можете использовать Classname::method() или же parent::method() синтаксис для вызова методов предка.

Вы делаете то же самое, создавая экземпляр объекта этого класса, а затем вызываете метод этого класса.

class MyClass
{
    /**
     * @var int
     */
    public $myVar = 0;

    // call it in a public function:
   public function myFunction()
   {
       return $this->myVar;
   }

}
$obj = new Myclass();
$result = $obj->myFunction();
print $result;
Другие вопросы по тегам