2016-03-08 97 views
4

我有一些问题。 我想从另一个类中调用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变量。 什么问题?

+4

'$ this'总是在当前目标点 - 该方法正在执行的那个。你不能使用'$ this'并魔法般地将它变成其他对象的“this”。即使你可以做'$ this - > $ class-> action()','$ class'只是一个字符串。它不是对象,也不指向对象的实例,因此即使该对象的名称是字符串,也不能用于在对象中执行方法。你可以使用它的唯一方法就是调用它所代表的类的一个** STATIC **方法。 –

回答

1

对象语法$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}"); 

如果你需要传递的参数使用call_user_func_array()

1

在PHP 7.0,你可以使用这样的代码:

<?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 5.6,并降低你可以使用call_user_func功能:

<?php 
class abc { 
static public function action() { 
    return "Hey"; 
} 
} 

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

public function test(){ 
    $data = call_user_func([ 
     $this->class, 
     $this->method 
    ]); 
    echo $data; 
} 
} 

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