php - रन-टाइम कॉलम के मापदंडों की संख्या कैसे प्राप्त करें?




reflection callback (2)

नोट: इस quesiton लिखने के आधार पर, मैं पहले से ही पता लगा है कि मैं एक नई भाषा की सुविधा का उपयोग करने के बारे में अत्यधिक उत्साही रहा था। दूर क्लीनर समाधान इसके बजाय एक रणनीति पैटर्न का उपयोग कर रहा था ... फिर भी, मैं उत्सुक हूँ अगर इस समस्या के बारे में जाने के लिए एक उचित तरीका है।

टीएल; डीआर: क्या आप सभी तरह के कॉल करने योग्य मैन्युअल रूप से टाइप करने के लिए बिना पीएचएल में एक सामान्य कॉलबल पर प्रतिबिंबित कर सकते हैं?

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.
?>

अब, मेरे लिए, यह अति जटिल महसूस करता है क्या मैं यहाँ कुछ करने की कोशिश कर रहा हूं, इसे हासिल करने के लिए किसी तरह का शॉर्टकट रास्ता याद कर रहा हूं? कोई अंतर्दृष्टि का स्वागत किया जाएगा :)


आप तर्क के साथ सरणी को पारित कर सकते हैं और कॉलबैक फ़ंक्शन के लिए दिया गया तर्क जानने के लिए सरणी मानों को गणना कर सकते हैं।


मैंने एक छोटे संस्करण बनाया जो call_user_func () की तरह काम करता है और इसे कॉलबैक / कॉलबल्स के लिए PHP मैनुअल में सभी विभिन्न प्रकारों पर परीक्षण किया गया। इस तरह आप इसे लगभग कहीं भी उपयोग कर सकते हैं call_user_func () केवल ऑब्जेक्ट नहीं लेता है, और मुझे यह समझ नहीं आया कि यह फ़ंक्शन किसी भी चाहिए, चूंकि यह केवल कॉलबैक को संभालना है।

टेस्ट और इसका उपयोग करने के तरीके पर सुझाव नीचे शामिल हैं और मुझे उम्मीद है कि यह मदद करता है:

function getNrOfParams($callable)
{
    $CReflection = is_array($callable) ? 
    new ReflectionMethod($callable[0], $callable[1]) : 
    new ReflectionFunction($callable);
    return $CReflection->getNumberOfParameters();
}

परीक्षा और इसका पूरा परिणाम:

<?php   
class Smart
{
    public function __invoke($name)
    {

    }

    public function my_callable($one, $two, $three)
    {

    }

    public static function myCallableMethod($one, $two) 
    {

    }

    public static function who()
    {
            echo "smart the parent class";
    }
}

class Smarter extends Smart
{
    public static function who()
    {
        echo "smarter";
    }
}

function my_ca($one)
{

}

function getNrOfParams($callable)
{
    $CReflection = is_array($callable) ? new ReflectionMethod($callable[0], $callable[1]) : new ReflectionFunction($callable);
    return $CReflection->getNumberOfParameters();
}
// Test 1 Callable Function
echo "Test 1 - Callable function:" . getNrOfParams('my_ca');

// Test 2 Static method
echo " Test 2 - Static class method:" . getNrOfParams(array('Smart', 'myCallableMethod'));

// Test 3 Object method
$smart = new Smart();
echo " Test 3 - Object method:" . getNrOfParams(array($smart, 'my_callable'));

// Test 4 Static method call (As of PHP 5.2.3)
//echo " Test 4 - Static class method call:" . getNrOfParams('Smart::myCallableMethod');
// Calling a static method this way does not work in ReflectionFunction.
// However, Test 2 provides a solution.

// Test 5 Relative static method (As of PHP 5.3.0)
//echo " Test 5 - Relative static class method:" . getNrOfParams(array('Smarter', 'parent::who'));
// Calling a relative static method doesn't work either. ReflectionMethod lacks support.
// All other tests work.

// Tesy 6 __invoke
echo " Test 6 - __invoke:" . getNrOfParams(array($smart, '__invoke'));

// Test 7 Closure
$closure = function($one, $two, $three)
{
    // Magic
};
echo " Test 7 - Closure:" . getNrOfParams($closure);




callback