Вызовы открытых переменных класса, совместимые в 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 я не понимаю.
- Как мы объявляем и вызываем переменные открытого класса в PHP 7.0?
- Как мы пишем этот код, чтобы быть совместимым между 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;