-1

In PHP 5.6:

When being inside a class we usually declare & call a public class variable like this:

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

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

}

I call the function like this:

MyClass::myFunction();

In PHP 7.0 that code throws a fatal error:

Using $this when not in object context

After changing my PHP version back to 5.6 again, the error was gone.

Questions:

I have to admit that after reading the manual and changes from 5.6 to 7.0 I don't get it.

  1. How do we declare and call public class variables in PHP 7.0?
  2. How do we write this code to be compatible between 5.6 and 7.0?

Edit after comments:

So why then a static call on a non static method works in 5.6?

toesslab
  • 4,981
  • 8
  • 41
  • 62

3 Answers3

5

In I'm loading maybe func() like this:

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

but can also be

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

You can not invoke method this way because it is not static method.

obj::func();

You should instead use:

obj->func();

If however you have created a static method something like:

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

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

then you can use this:

obj::func();
DevLoots
  • 756
  • 6
  • 21
1

The behavior you describe can be found in the following example:

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

In PHP 5 you can call a public method of other classes, when you are inside an instance. It will work as it was a member of the class in the current $this context. PHP 7 is more stict. You can extend classes or import traits into classes in different inheritance lines. There is no need to steel other classes' methods. You can still use the Classname::method() or parent::method() syntax to call ancestor's methods.

Quasimodo's clone
  • 5,865
  • 2
  • 20
  • 40
0

You accomplish the same by instantiating object of that class and then call that class's 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;
Sagar
  • 632
  • 3
  • 14