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());
}
调用方式:
- SubClass::callMe
使其成为静态 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);
}
}
美好的一天,
我有以下无法正常工作的测试用例。
<?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.
中加载一个新的 classpublic 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());
}
调用方式:
- SubClass::callMe
使其成为静态 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);
}
}