注意:由於寫了這個問題,我已經發現我對使用新的語言功能過於狂熱。更清潔的解決方案是使用戰略模式,而不是...仍然,我很好奇,如果有一個正確的方法去解決這個問題。如何獲取運行時確定可調用參數的數量?
TL; DR:您是否可以在PHP中使用泛型Callable而不訴諸手動查找各種可調用類型?
在PHP 5.4中,我們有一個新的提示:可調用。這看起來很有趣。我想我會利用這個通過如下:
<?php
public function setCredentialTreatment(callable $credentialTreatment) {
// Verify $credentialTreatment can be used (ie: accepts 2 params)
... magic here ...
}
?>
到目前爲止,我的思路已經做了一系列的類型檢查的調用,並從其中推斷的反思*類使用:
<?php
if(is_array($callable)) {
$reflector = new ReflectionMethod($callable[0], $callable[1]);
} elseif(is_string($callable)) {
$reflector = new ReflectionFunction($callable);
} elseif(is_a($callable, 'Closure') || is_callable($callable, '__invoke')) {
$objReflector = new ReflectionObject($callable);
$reflector = $objReflector->getMethod('__invoke');
}
// Array of ReflectionParameters. Yay!
$parameters = $reflector->getParameters();
// Inspect parameters. Throw invalidArgumentException if not valid.
?>
對我來說,這感覺過於複雜。我是否錯過某種實現我在此嘗試做的事情的捷徑?任何見解都會受到歡迎:)
我遇到了類似的問題,並最終創建一個幫助函數來獲取任何可調用的Reflection對象。這個函數的代碼和你的代碼非常相似。 – Benjamin
我不知道如果你繼續這樣做,但你有沒有考慮創建自己的CallableReflection,這有助於更輕鬆地打包差異? – hakre
最後我還沒有進一步追求這個路徑,但是創建一個可重複使用的CallableReflection確實看起來像是朝着正確方向邁出的一步。不過,在某些時候,我期望PHP的Reflection模塊能夠在這些方面提供一些東西。 – kander