【问题标题】:PHP forward_static_call_array in a non-static class context非静态类上下文中的 PHP forward_static_call_array
【发布时间】:2015-03-23 10:08:49
【问题描述】:

早安,

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

<?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 测试类

这是一个非静态类,被以下对象调用:

$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 子类

子类获取参数如下:

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

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

private $obj                =   NULL;

get 完全避免了。

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

【问题讨论】:

  • 您期望的输出是什么?您当前的输出是什么?此外,您的类中没有任何静态函数!
  • 我知道。我想使用类变量 $obj 所以它应该是forward_static_call_array('$this-&gt;obj-&gt;callMe', func_get_args()); 但这不起作用:-o

标签: php arguments forwarding


【解决方案1】:

我想你想改变这个:

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

【讨论】:

  • 这行得通!谢谢!!在问题中添加了完整的工作代码。另外,我添加了一些额外的选项来证明这个概念的功能。
  • 我们应该如何处理动态生成类名的特殊情况? (即:类名是包含在字符串变量中的字符串)
  • @FMaz008 如示例中的$this-&gt;obj 将包含类名。
猜你喜欢
  • 1970-01-01
  • 2012-11-02
  • 2014-12-24
  • 1970-01-01
  • 2014-12-25
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多