2014-10-18 64 views
1

在PHP5中,变量可以被评估为功能1如:PHP - 你能分配一个成员函数给变量吗?

function myFunc() { 
    echo "whatever"; 
} 

$callableFunction = 'myFunc'; 

$callableFunction(); // executes myFunc() 

是否有诸如分配对象的成员函数的变量任何语法:

class MyClass { 
    function someCall() { 
     echo "yay"; 
    } 
} 

$class = new MyClass(); 

// what I would like: 
$assignedFunction = $class->someCall; // but I tried and it returns an error 

$memberFunc = 'someCall'; 
$class->$memberFunc(); // I know this is valid, but I want a single variable to be able to be used to call different functions - I don't want to have to know whether it is part of a class or not. 

// my current implementation because I don't know how to do it with anonymous functions: 
$assignedFunction = function() { return $class->someCall(); } // <- seems lengthy; would be more efficient if I can just assign $class->someCall to the variable somehow? 

$assignedFunction(); // I would like this to execute $class->someCall() 
+0

是的,你可以使用php的call_user_function()方法。 – 2014-10-18 03:56:12

+0

call_user_function()不符合我的要求..我仍然需要知道使用call_user_function()调用哪个类和哪个函数。我想编写调用''customFunc()'''调用,以便能够在运行时调用任意函数,而无需事先知道它是内置函数,用户函数,类静态函数还是类对象成员函数。 – PressingOnAlways 2014-10-18 04:09:13

回答

4

有一个办法,但是对于PHP 5.4及以上...

class MyClass { 
    function someCall() { 
     echo "yay"; 
    } 
} 

$obj = new Myclass(); 

$ref = array($obj, 'someCall'); 

$ref(); 

嗯..实际上它适用于静态太大,只是使用由名称引用..

class MyClass { 
    static function someCall2() { 
     echo "yay2"; 
    } 
} 

$ref = array('MyClass', 'someCall2'); 

$ref(); 

而对于nonstatic这个符号也适用。它创建该类的临时实例。所以,这是你需要的,只有你需要php 5.4及以上版本)

+0

完美!如果你能找到一个php5.3解决方案,请告诉我。我可能需要有一些向后兼容性。 – PressingOnAlways 2014-10-18 05:40:00

-1

@PressingOnAlways,你可以这样做这通过以下方式:

<?php 
class Foo 
{ 
    function Variable() 
    { 
     $name = 'Bar'; 
     $this->$name(); // This calls the Bar() method 
    } 

    function Bar() 
    { 
     echo "This is Bar"; 
    } 
} 

$foo = new Foo(); 
$funcname = "Variable"; 
$foo->$funcname(); // This calls $foo->Variable() 

?> 

这是标准程序,即使您可以更改$ funcname变量,以便他们可以调用diffe租赁功能容易。

您可以访问this

让我知道如果你还有任何问题。

+3

他在他的问题中列出了这个方法。 '$ class - > $ memberFunc()//我知道这是有效的,但我希望单个变量能够用来调用不同的函数 - 我不想知道它是否是类的一部分否则。 – Cheery 2014-10-18 04:05:09

+0

@ Cheery,但是这是标准程序,即使用户可以每次更改$ funcname变量,以便他们可以轻松地调用不同的类功能。 你可以访问[this](http://php.net/manual/en/functions.variable-functions.php) – 2014-10-18 04:11:39

+0

那么是什么?他知道这件事,但不想这样使用它。 – Cheery 2014-10-18 04:14:11

1

上面的PHP 5.4解决方案是好的。如果你需要PHP 5.3,我不认为你可以做得比匿名函数的做法要好得多,但你可以换到这一点,作用非常类似PHP 5.4方法的功能:

function buildCallable($obj, $function) 
{ 
    return function() use ($obj, $function) { 
     $args = func_get_args(); 
     return call_user_func_array(array($obj, $function), $args); 
    }; 
} 

//example 
class MyClass 
{ 
    public function add($x, $y) 
    { 
     return $x + $y; 
    } 

    public static function multiply($x, $y) 
    { 
     return $x * $y; 
    } 
} 

//non-static methods 
$callable = buildCallable(new MyClass(), 'add'); 
echo $callable(32, 10); 

//static methods 
$callable = buildCallable('MyClass', 'multiply'); 
echo $callable(21, 2); 

这应该工作对于任何(公开可见的)方法的任何数量的参数。

相关问题