PHP forward_static_call_array 在非静态 class 上下文中

PHP forward_static_call_array in a non-static class context

美好的一天,

我有以下无法正常工作的测试用例。

<?php

class TestClass{
private $obj                =   NULL;



public function __construct(){
    $this->obj = new SubClass();    
}



public function test(){
    forward_static_call_array('SubClass::callMe', func_get_args());
}
}


class SubClass{
    public function callMe(){
        echo 'YES WE FETCHED : '.PHP_EOL.print_r(func_get_args(), true);
    }
}



$test = new TestClass();
$test->test('John', 'Doe', array('Peter', 'Dora'), array('Anthony', 'William'));
?>

如你所见,我有两个 class。

1 个测试类

这是一个非静态 class,正在被调用:

$test = new TestClass();
$test->test('John', 'Doe', array('Peter', 'Dora'), array('Anthony', 'William'));

TestClass() 中,我使用构造函数在父 class.

中加载一个新的 class
public function __construct(){
    $this->obj = new SubClass();    
}

然后我使用以下行加载名为 test() 的 class 方法:

$test->test('John', 'Doe', array('Peter', 'Dora'), array('Anthony', 'William'));

此方法然后获取函数参数:func_get_args() 并使用 forward_static_call_array()

转发所有参数

如下:

public function test(){
    forward_static_call_array('SubClass::callMe', func_get_args());
}

调用方式:

使其成为静态 class。从逻辑上讲,我收到一条错误消息:

严格标准:forward_static_call_array() 期望参数 1 是一个有效的回调,非静态方法 SubClass::callMe() 不应在 N 中静态调用:\wamp\www\test\forward_arguments\testclass.php 第 15 行

2 个子类

子类获取参数如下:

public function callMe(){
    echo 'YES WE FETCHED : '.PHP_EOL.print_r(func_get_args(), true);
}

现在有了这个设置,错误通知是合乎逻辑的。 和 TestClass class 变量

private $obj                =   NULL;

get 完全避免了。

$this->obj = new SubClass();    

具体问题

问题是这一行:

forward_static_call_array('SubClass::callMe', func_get_args());

语法应该不同。但我不知道如何。 提前致谢!

编辑:

问题是我确实知道如何调用静态 class 方法。但是我不知道如何在加载的 class.

中调用方法

解决方案

(提供者:Rizier123

<?php

class TestClass{
    private $obj                =   NULL;



    public function __construct(){
        $this->obj = new SubClass();    
        $this->obj->SetExtra(array('Karel', 'Anton'));
    }



    public function test(){
        forward_static_call_array([$this->obj, 'callMe'], func_get_args());
    }
}


class SubClass{
    private $SetVar = NULL;

    public function callMe(){
        $Array = $this->ArrayStrUp(array_merge(func_get_args(), $this->SetVar));

        echo 'YES WE FETCHED : '.PHP_EOL.print_r($Array, true);
    }

    public function SetExtra($vars){
        $this->SetVar = $vars;
    }



    private function ArrayStrUp($Arr){
        foreach($Arr as $key => $value){
            if(is_array($value) === true){
                $Arr[$key] = $this->ArrayStrUp($value);
            }
            else{
                $Arr[$key] = strtoupper($value);
            }
        }

        return($Arr);
    }
}



$test = new TestClass();
$test->test('John', 'Doe', array('Peter', 'Dora'), array('Anthony', 'William'));
?>

我想你想改变这个:

forward_static_call_array('SubClass::callMe', func_get_args());

至:

forward_static_call_array([$this->obj, 'callMe'], func_get_args());

而且你还必须声明你的方法是静态的,例如:

class SubClass{
    public static function callMe(){
         //^^^^^^ See here
        echo 'YES WE FETCHED : '.PHP_EOL.print_r(func_get_args(), true);
    }
}