2010-09-24 5 views
7

मैं PHP 5.2.6 का उपयोग कर रहा हूँ। मेरे पास एक रणनीति पैटर्न है, और रणनीतियों के पास एक स्थिर विधि है। कक्षा में जो वास्तव में रणनीतियों में से एक को लागू करता है, उसे तत्काल करने के लिए रणनीति वर्ग का नाम मिलता है। हालांकि, मैं इन्स्टेन्शियशन से पहले स्थिर तरीकों में से एक कॉल करने के लिए, इस तरह चाहता था:कक्षा से वैरिएबल विधि को परिवर्तनीय नाम के रूप में कॉल नहीं कर सकता?

$strNameOfStrategyClass::staticMethod(); 

लेकिन यह T_PAAMAYIM_NEKUDOTAYIM देता है।

$> cat test.php 

<? 

interface strategyInterface { 
     public function execute(); 
     public function getLog(); 
     public static function getFormatString(); 
} 


class strategyA implements strategyInterface { 
     public function execute() {} 
     public function getLog() {} 
     public static function getFormatString() {} 
} 

class strategyB implements strategyInterface { 
     public function execute() {} 
     public function getLog() {} 
     public static function getFormatString() {} 
} 

class implementation { 
     public function __construct(strategyInterface $strategy) { 
       $strFormat = $strategy::getFormatString(); 
     } 
} 

$objImplementation = & new implementation("strategyB") ; 

$> php test.php 

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /var/www/test.php on line 24 

$> php -v 

PHP 5.2.6-1+lenny9 with Suhosin-Patch 0.9.6.2 (cli) (built: Aug 4 2010 03:25:57) 

क्या यह 5.3 में काम करेगा?

उत्तर

11

हां। यही कारण है कि वाक्य रचना 5.3

में पेश किया गया था के लिए < = 5.2 वैकल्पिक हल के लिए आप call_user_func उपयोग कर सकते हैं:

call_user_func(array($className, $funcName), $arg1, $arg2, $arg3); 

या call_user_func_array:

call_user_func_array(array($className, $funcName), array($arg1, $arg2, $arg3)); 

लेकिन एक और नोट पर, क्या आप की कोशिश कर रहे वास्तव में समझ में नहीं आता है ...

यह एक स्थिर कार्य के रूप में क्यों है? implementation में आपका कन्स्ट्रक्टर किसी ऑब्जेक्ट की अपेक्षा कर रहा है (यही strategyInterface $strategy ढूंढ रहा है)। एक स्ट्रिंग पास करना काम नहीं करेगा, क्योंकि तार इंटरफेस को लागू नहीं करते हैं।

$strategy = new StrategyB(); 
$implementation = new Implementation($strategy); 

फिर, निर्माता में:: तो मैं क्या कर सकता है, इंटरफ़ेस गैर स्थिर बनाने के लिए, और उसके बाद की तरह कुछ करना है

$strFormat = $strategy->getFormatString(); 

या, आप वास्तव में अभी भी है कि विधि चाहते हैं स्थिर तुम कर सकते हो हो:

$strFormat = call_user_func(array(get_class($strategy), 'getFormatString')); 

ओह, और = & new synax deprecated है (और आप क्या सोचते हैं यह वैसे भी करता है नहीं है)।

+1

के लिए कैसे करने के लिए +1 टाइपिंग समस्या के साथ सौदा –

+0

आज मस्तिष्क के फार्ट होने के बाद: पीआई कार्यान्वयन वर्ग को तत्काल ऑब्जेक्ट पास नहीं करना चाहता, क्योंकि मैं इसे लाइन पर तुरंत चालू करना चाहता हूं, कार्यान्वयन वर्ग ने कुछ डेटा बनाया है जो स्ट्रैट ईजी जरूरत है। मुझे लगता है कि मुझे 'call_user_func_array()' वैसे भी चाहिए '- महान कोड के लिए धन्यवाद! – user151841

+0

ध्यान दें कि यह केवल 5.3 में काम करता है। आप "$ foo :: staticMethod()" कर सकते हैं लेकिन आप "$ this-> foo = new जो भी(); $ this-> foo :: staticMethod()" नहीं कर सकते हैं। –

0

प्रकार हिंट आप कुछ समस्याओं को देने के लिए जा रहा है:

तर्क 1 कार्यान्वयन के लिए पारित :: __ निर्माण() इंटरफ़ेस strategyInterface को लागू करना चाहिए, स्ट्रिंग दिया

+0

एचएम, मस्तिष्क आज सुबह मस्तिष्क। मेरे PHP ने मुझे यह त्रुटि क्यों नहीं दी? – user151841

+0

@ user151841 - क्योंकि अप्रत्याशित T_PAAMAYIM_NEKUDOTAYIM संकलन समय पर पता चला है, इसलिए आपको वह त्रुटि मिल रही थी ... मैंने कोड को चलाने की कोशिश करने से पहले call_user_func() के साथ तय किया, और दूसरी त्रुटि मिली, जो रनटाइम त्रुटि है। –

संबंधित मुद्दे

 संबंधित मुद्दे