使用call_user_func函數,通過傳入字串函數,可以調用自訂函數,並且支援引用。
1.mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )
調用第一個參數提供的自訂函數,後面的參數為自訂函數的參數,返回自訂函數的結果
function say($word)
{
echo $word;
}
call_user_func('say', 'hello world'); //hello world
使用call_user_func可以執行一個類的某個方法,而且可以給方法傳參數,它跟執行個體化一個類再調用方法有什麼區別呢?看下面的例子。
class A
{
public function __Construct($a,$b,$c)
{
echo 'Construct'.$a.$b.$c;
}
public function test($a,$b,$c)
{
echo ' test'.$a.$b.$c;
}
}
$a = new A(1,2,3);
$a->test(1,2,3);
call_user_func(['A','test'],1,2,3);
類A有一個構造方法,如果用執行個體化的方式new A,會執行建構函式,而使用call_user_func的方式調用test方法,並沒有出發建構函式,雖然都可以執行到方法,這就是兩者的區別。
那麼在有的情況下,並不能直接執行個體化一個類,希望通過其他方式去得到一個類,而且能夠執行類的構造方法怎麼辦?
此時可以使用類的反射類和newInstanceArgs來建立一個新的類的執行個體,代碼如下:
$reflection = new ReflectionClass('A');
$newclass = $reflection->newInstanceArgs([1,2,3]);
$newclass->test(1,2,3);
它的效果等同於:
$a = new A(1,2,3);
$a->test(1,2,3);
具體可以參見
首先定義一個類A,用ReflectionClass得到A的反射類對象,通過ReflectionClass對象可以得到類的各種屬性,包括命名空間,父類,類名等,使用newInstanceArgs可以傳入建構函式的參數建立一個新的類的執行個體。
class A
{
public $name;
public function __Construct($name,$des)
{
$this->name = $name.','.$des;
}
public function aa()
{
echo $this->name;
}
}
$class = new ReflectionClass('A');
$aaa = $class->newInstanceArgs(['www.111cn.net','blog']);
$aaa->aa();
輸出結果:www.111cn.net,blog
以上樣本中的$aaa即是通過newInstanceArgs建立的一個新的A類的執行個體,因此它可以調用A類的方法aa(),值得注意的是newInstanceArgs建立新類必須傳參,也就是要求這個類要有構造方法。