Calling static method from object array variable

In PHP you can call a class's static method from an object instance (which is contained in an array) like this:

$myArray['instanceOfMyClass']::staticMethod(); // works

But for some reason when I use the $this variable, I get a parsing error. E.g:

$this->myArray['instanceOfMyClass']::staticMethod(); // PARSING ERROR

Just to illustrate what I mean:

class MyClass{
    public static function staticMethod(){ echo "staticMethod called\n"; }
}

$myArray = array();
$myArray['instanceOfMyClass'] = new MyClass;
$myArray['instanceOfMyClass']::staticMethod(); // works

class RunCode
{
    private $myArray;

    public function __construct(){
        $this->myArray = array();
        $this->myArray['instanceOfMyClass'] = new MyClass;
        $this->myArray['instanceOfMyClass']::staticMethod(); // PARSING ERROR
    }
}

new RunCode;

Any ideas on how to get around this?

Answers


You actually can use "->" to call static method:

$this->myArray['instanceOfMyClass']->staticMethod();

This is a really interesting problem, it may even be a bug in PHP itself.

For a work around, use the KISS principle.

class RunCode
{
    private $myArray;

    public function __construct(){
        $this->myArray = array();
        $this->myArray['instanceOfMyClass'] = new MyClass;

        $instance = $this->myArray['instanceOfMyClass']
        $instance::staticMethod();
    }
}

Hope this helps!


You will have to break up the one liner using a temporary variable, e.g.

$inst = $this->myArray['instanceOfMyClass'];
$inst::staticMethod()

This is one of many cases where PHP's compiler is not clever enough to understand nested expressions. The PHP devs have been improving this recently but there is still work to do.


Need Your Help

How to close file after using xlutils.filter

python xlutils

Can anyone help me to delete an xls-file after using xlutils.filter (http://www.python-excel.org/) and fix the following error? I try to remove an excel file from the filesystem (Windows 7 64-bit) ...

How can I stop iOS displaying snapshot on resume?

ios objective-c uikit

I am creating an app with functionality like a stopwatch. When the app moves to the background, iOS takes a snapshot, and when it moves back into the foreground it uses that snapshot for the animat...