PHP forward_static_call_array在非静态类上下文中

时间:2015-03-23 10:08:49

标签: php arguments forwarding

美好的一天,

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

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

如你所见,我有两节课。

1 TestClass

这是一个非静态类,由:

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

TestClass()中,我在构造函数中加载了父类中的新类。

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

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

$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());
}

通过以下方式致电:

  • 子类::的CallMe

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

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

2 SubClass

subClass 获取如下参数:

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

现在使用此设置,错误通知是逻辑。 和 TestClass 类变量

private $obj                =   NULL;

完全避免。

$this->obj = new SubClass();    

特定问题

问题在于:

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

语法应该不同。但我不知道怎么做。 提前谢谢!

修改

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

解决方案

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

1 个答案:

答案 0 :(得分:2)

我想你想改变这个:

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);
    }
}