2013-09-03 11 views
9

तक स्थिर पहुंच का उपयोग करने से बचें मैंने पहली बार PHPMD को निकाल दिया है और, अनुमानतः, मुझे एक त्रुटि मिली है जिसे मैं समझ नहीं सकता। त्रुटिअपवाद

विधि 'setLang' में 'अवैध अमान्यता अपवाद' श्रेणी में स्थिर पहुंच का उपयोग करने से बचें।

और कोड

public function setLang($val0) { 
    switch ($val0) { 
    case ENG: 
    case FRE: 
    case SPA; 
     $this->lang = $val0; 
     break; 
    default: 
     throw new InvalidArgumentException("Invalid language choice."); 
    } 
} 

मैं अलग अलग बातें की एक किस्म की कोशिश की है, लेकिन मैं दिन Exception के अंत में लगता है एक स्थिर कारखाना है (???) तो यह स्थिर होना आवश्यक है पहुंच। लेकिन, पीएचपीएमडी लोग मुझसे ज्यादा चालाक हैं ताकि उन्हें परेशान न किया जाए।

यह चेतावनी क्यों मौजूद है, और इसे कैसे हल करें?

उत्तर

8

इस चेतावनी के पीछे विचार यह है कि यदि आप new कीवर्ड के साथ अपने कोड के अंदर कक्षा के नाम एम्बेड करते हैं तो इन वर्गों को परीक्षण और नकली या स्टब विधियों में स्वैप करना मुश्किल होगा, जो परीक्षण के तहत कोड उन्हें कॉल कर सकते हैं। PHPMD नियमों में See the explanation

मुझे लगता है कि आपके मामले में यह गलत सकारात्मक है क्योंकि अपवादों का आमतौर पर अपने आप पर अधिक व्यवहार नहीं होता है, लेकिन वर्ग का नाम (और उसके पीछे वर्ग पदानुक्रम) उनमें से केवल एक चीज महत्वपूर्ण है।

यदि आप यहां चेतावनी से छुटकारा पाने के लिए चाहते हैं, तो आप यहां @SupressWarnings एनोटेशन का उपयोग कर सकते हैं।

+0

धन्यवाद। तो, क्या मैं इसे बंद कर सकता हूं, या किसी भी तरह से बच सकता हूं? – Ben

+0

ओह, मुझे कहना चाहिए कि मैं अभी अपवाद हैंडलिंग में बदल गया हूं। इससे पहले कि मैं सिर्फ 'मर() 'का उपयोग कर रहा था लेकिन यह गलत लगा। – Ben

+1

मैं PHPMD के साथ घनिष्ठ रूप से familliar नहीं हूँ, लेकिन यह ['@ SuppressWarnings'] (http://phpmd.org/documentation/suppress-warnings) को समझना चाहिए।एचटीएमएल) एनोटेशन। – complex857

2

आह, चारों ओर खोदने के बाद मुझे सीधे घोड़े के मुंह से जवाब मिला है।

yourphpdir\data\PHP_PMD\resources\rulesets पर स्थित कॉन्फ़िगरेशन फ़ाइलों में, cleancode.xml में सीडीएटीए टिप्पणियां हैं जो सेटिंग की व्याख्या करती हैं।

यह एक का कहना है:

स्टेटिक acccess अन्य वर्गों के लिए inexchangable निर्भरता का कारण बनता है और कठिन की ओर जाता है कोड का परीक्षण करने के लिए। सभी लागतों पर स्थिर पहुंच का उपयोग करने से बचें और इसके बजाय कन्स्ट्रक्टर के माध्यम से निर्भरता इंजेक्ट करें। एकमात्र मामला जब स्थिर पहुंच स्वीकार्य है तो कारखाने के तरीकों के लिए उपयोग किया जाता है।

इसे हल करने का तरीका सिर्फ पैरामीटर के रूप में अपवाद पास कर रहा है, इसलिए इसे कक्षा के बाहर घोषित किया गया है।

$foo->setLang("Oh noes!", new InvalidArgumentException("No lang for you.")); 
+2

हां, PHPMD ने यहां 'अवैध अमान्यता अपवाद' पर छिपी निर्भरता को सफलतापूर्वक स्पॉट किया है। हालांकि @ कॉम्प्लेक्स 857 ने अपने [उत्तर] में भी टिप्पणी की (http://stackoverflow.com/users/1515540/complex857) मैं कहूंगा कि यह एक बढ़त मामला है क्योंकि अपवाद फेंकने के लिए आम तौर पर एक गैर-इंजेक्शन क्लास- नाम। कारखाने के भीतर, अपवाद वर्ग-नाम आपके कोड की एक संपत्ति है, न कि इंजेक्शन-सक्षम निर्भरता (कम से कम इस निम्न स्तर पर नहीं)। और आपने पहली जगह 'मर() 'को सही जगह पर बदल दिया था। सभी 'मरने() की पहली हत्या पर ध्यान केंद्रित करें: डी। – hakre

+0

@ hakre स्पष्टीकरण अच्छा है। हालांकि, मुझे यह मानना ​​है कि यह एक झूठी सकारात्मक प्रतीत होता है, क्योंकि आप इस मुद्दे को इंगित करने वाले लाइब्रेरी दिनचर्या से विभिन्न अपवाद वापस कर सकते हैं (भाषा सेट करने में भाषा स्थापित नहीं हो सकती है, उपयोगकर्ता सुरक्षा, कोई अनुवाद नहीं है, आदि ...) और अपवाद इसलिए विभिन्न प्रकार के हो सकते हैं ताकि कॉलर इस मुद्दे के आधार पर जारी/निरस्त हो सके। मुझे लगता है कि झूठी सकारात्मक नजरअंदाज करने में मदद के लिए इसे PHP_MD में समायोजित करने की आवश्यकता है, क्योंकि मैं कोड में बहुत से @ SuppressWarnings (PHPMD.StaticAccess) नहीं चाहता हूं। –

+2

@ स्टेवेनस्कॉट: मुझे इसे "झूठी सकारात्मक" बनाने के लिए थोड़ा कठोर लगता है। चूंकि PHPMD स्थिर कोड विश्लेषण करता है, यह केवल उस कोड के भीतर बिंदुओं की रिपोर्ट कर सकता है जो कुछ नियमों द्वारा उल्लंघन (या पकड़ लिया जाता है)। इस प्रोग्राम को पढ़ने और नियम को समझने के लिए प्रोग्रामर पर निर्भर है, फिर तय करें कि क्या करना है। एक स्थिर कोड-विश्लेषण इन प्रोग्रामर चरणों के लिए कभी भी नहीं हो सकता है, यह केवल एक ऐसा टूल है जो कोडबेस के बारे में अधिक जानकारी रखने में मदद कर सकता है। ऐसा कहकर, ऐसे नियमों के अपवाद हो सकते हैं जो समझ में आ सकें (कभी-कभी)। – hakre

0

क्योंकि मैं स्थिरांक के लिए बहुत से आत्म :: का उपयोग करता हूं, स्वयं को स्वीकार करने के लिए phpmd कोड बदलता हूं और माता-पिता ::।

कार्यक्रम PHP में/PMD/नियम/लाइन 36 पर CleanCode/StaticAccess.php, करने के लिए परिवर्तन:

if ($this->isReferenceInParameter($reference) 
    || $reference->getImage() === 'self' 
    || $reference->getImage() === 'parent' 
    ) { 
    continue; 
} 

हो सकता है कि आप उसका प्रयोग कोड को परिष्कृत कर सकते हैं।

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