2014-10-18 67 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); 

這應該工作對於任何(公開可見的)方法的任何數量的參數。

相關問題