Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从另一个类宽度调用类的静态方法'$这';_Php_Class_Methods_Static - Fatal编程技术网

Php 从另一个类宽度调用类的静态方法'$这';

Php 从另一个类宽度调用类的静态方法'$这';,php,class,methods,static,Php,Class,Methods,Static,我有点问题。 我想从另一个类调用类的static方法。 类名和方法是动态创建的 这其实并不难做到,比如: $class = 'className'; $method = 'method'; $data = $class::$method(); 但是,我想这样做 class abc { static public function action() { //some code } } class xyz { protected $method = 'a

我有点问题。 我想从另一个类调用类的
static
方法。 类名和方法是动态创建的

这其实并不难做到,比如:

$class = 'className';
$method = 'method';

$data = $class::$method();
但是,我想这样做

class abc {
    static public function action() {
        //some code
    }
}

class xyz {
    protected $method = 'action';
    protected $class = 'abc';

    public function test(){
        $data = $this->class::$this->method();
    }
}
如果我不将
$this->class
分配给
$class
变量,将
$this->method
分配给
$method
变量,那么它就不起作用。
问题出在哪里?

对象语法
$this->class
$this->method
在静态调用中与
组合时,会使解析器感到不明确。我尝试了各种变量函数/字符串插值的组合,比如
{$this->class}:{$this->method}()
,等等。。。没有成功。因此,赋值给局部变量是唯一的方法,或者像这样调用:

$data = call_user_func(array($this->class, $this->method));

$data = call_user_func([$this->class, $this->method]);

$data = call_user_func("{$this->class}::{$this->method}");
<?php
class abc {
 static public function action() {
  return "Hey";
 }
}

class xyz {
 protected $method = 'action';
 protected $class = 'abc';

 public function test(){
  $data = $this->class::{$this->method}();

  echo $data;
 }
}

$xyz = new xyz();
$xyz->test();

如果需要传递参数,请使用。

在PHP 7.0中,可以使用如下代码:

$data = call_user_func(array($this->class, $this->method));

$data = call_user_func([$this->class, $this->method]);

$data = call_user_func("{$this->class}::{$this->method}");
<?php
class abc {
 static public function action() {
  return "Hey";
 }
}

class xyz {
 protected $method = 'action';
 protected $class = 'abc';

 public function test(){
  $data = $this->class::{$this->method}();

  echo $data;
 }
}

$xyz = new xyz();
$xyz->test();

$此
始终指向当前对象-方法正在其中执行的对象。你不能使用
$this
,然后神奇地让它变成其他对象的“this”。即使你可以做
$this->$class->action()
$class
也只是一个字符串。它不是对象,也不指向对象的实例,因此您不能使用它在对象中执行方法,即使该字符串是某个对象的名称。唯一可以使用它的是调用它所表示的类的静态方法。