आईडीई के लिए जादू (_call और _callStatic) विधियों का दस्तावेज कैसे करें


81

नोटपैड ++ और उदात्त में कोडिंग के कई खुश वर्षों के बाद, मुझे सलाह दी गई है कि मुझे एक पीएचपी आईडीई दिया जाए। मैं phpStorm की कोशिश कर रहा हूँ और यह अच्छा लगता है। कोड पूरा होने और दस्तावेज़ीकरण एक महान विशेषता है, लेकिन जादू के तरीकों का उपयोग करने पर मेरे लिए काम नहीं कर रहा है। क्या जादू विधियों में क्या चल रहा है, यह समझने के लिए phpStorm प्राप्त करने के लिए चारों ओर एक काम है?

हमारी स्थिति कुछ इस प्रकार है:

abstract class a {
    public static function __callStatic($method,$args)
    {
        if(strpos($method,"get_by_") === 0)
        {
            //do stuff
        } elseif(strpos($method,"get_first_by_") === 0) {
            //do stuff
        } elseif($method == "get_all") {
            //do stuff
        }
    }
}

class b extends a {
    // some more stuff
}

b::get_by_user_id(27);
b::get_first_by_id(156);
b::get_all();

मैजिक कॉलस्टैटिक विधि हमें 1 या अधिक तर्कों के माध्यम से वस्तुओं का एक संग्रह प्राप्त करने की अनुमति देती है जो फ़ंक्शन कॉल करती हैं।

मैं देख रहा हूं कि इन मामलों में उपयोग के लिए @method बयान है लेकिन phpStorm केवल इन बयानों में से सबसे पहले उठा रहा है। इसके अलावा मैं केवल मिश्रित प्रकार को मिश्रित करने के लिए सेट कर सकता हूं, जहां मैं इसे सेट करने में सक्षम होना चाहूंगा क्योंकि इसे जिस भी वर्ग पर बुलाया गया था (मेरे उदाहरण में बी)।

कोई भी विचार या सुझाव बहुत आभार प्राप्त होगा, धन्यवाद।


1
क्यों किसी को भी लगता है कि _callएक अच्छा विचार है? !!
ब्रायन गॉर्डन

गॉट्टा कहते हैं, + 1 ब्रायन की घटना में टिप्पणी है कि किसी भी समझदार व्यक्ति को इस सवाल का पता चल जाएगा। जादू के तरीके सभी इरादों और उद्देश्यों के लिए हैं: undocumentable (एक दस्तावेज़ (एन) के लिए प्रयास करें [पैरामीटर | पूर्व शर्त | पोस्टकंडिशन। एक जादू पद्धति के लिए अपवाद)), आईडीई-फ्रेंडली (एक जादू की विधि को डीबग करने का प्रयास नहीं), रिफैक्टरिंग के लिए लचीला। (कृपया, सॉफ्टवेयर के एक टेन्योर टुकड़े में एक जादू विधि को फिर से भरने की कोशिश करने पर भी विचार न करें), और LAZY (ठीक है, पिछले एक राय के रूप में माना जा सकता है)।
ल्यूक ए। लेबर

17
-1 में टिप्पणी करने के लिए @ ल्यूका द्वारा टिप्पणी। क्योंकि यह दृष्टि की कमी का सबूत है। जबकि जादू के तरीके कम कोड लिखने का एक तरीका नहीं है (यदि आप उन्हें आलसी होने के लिए उपयोग कर रहे हैं), जादू के तरीकों से आर्किटेक्चर संभव हो जाता है कि सरल अन्यथा संभव नहीं होगा या यह इतना अपमानजनक होगा कि यह लिखने लायक नहीं होगा। और वे PHPDoc का उपयोग करते समय पूरी तरह से आईडीई के अनुकूल हैं। ध्यान दें कि अधिकांश समय आपको जादू के तरीकों की आवश्यकता नहीं होती है, लेकिन जब आपको उनकी आवश्यकता होती है तो कोई विकल्प नहीं होता है (PHP में।) जब उनका उपयोग बहुत ही संरचित तरीके से किया जाता है तो उनका उपयोग एक पूर्ण वैध समाधान होता है।
माइकस्किंकल

5
मत सोचो कि ओवरराइड __callकरना एक बुरा विचार है। यह सब कार्यान्वयन के बारे में है। उपरोक्त प्रश्न में दिखाया गया कार्यान्वयन निश्चित रूप से सबसे अच्छा तरीका नहीं होगा, लेकिन चेन-सक्षम एपीआई के लिए, यह बहुत अधिक लचीलेपन की अनुमति देता है।
स्टीव बॉमन

जवाबों:


144

वर्ग-स्तरीय PHPDoc टिप्पणी का उपयोग करें - विशेष रूप से @method टैग - PhpStorm में ठीक काम करता है:

/**
 * @method static someClass get_by_user_id(int $id) Bla-bla
 * @method static someClass get_first_by_id(int $id) 
 */
abstract class a {
...

ऊपरोक्त में:

  • @method - PHPDoc टैग
  • static - बताता है कि यह स्थैतिक विधि है
  • someClassया $this- वापसी प्रकार
  • get_by_user_id - विधि का नाम
  • (int $id) - विधि हस्ताक्षर: ([[type] [parameter]<, ...>])
  • Bla-bla - कुछ वैकल्पिक विवरण

के बारे में अधिक @method:

PS जबकि @method staticPhpStorm में ठीक काम करता है (IDE बताता है कि यह विधि स्थिर है) यह वास्तविक phpDocumentor टूल द्वारा समर्थित (अभी तक?) नहीं हो सकता है (क्षमा करें, कुछ समय के लिए इसका उपयोग नहीं किया है)।


वैकल्पिक रूप से : (PhpStorm में, निश्चित रूप से) Settings | Inspections | PHP | Undefined | Undefined method --> Downgrade severity if __magic methods are present in class- यह किसी भी तरह से इस तरह के तरीकों के लिए कोड पूरा करने में मदद नहीं करेगा, लेकिन उन जादुई तरीकों को "अपरिभाषित विधि" त्रुटियों के रूप में चिह्नित नहीं करेगा।


RegEx / आंशिक नाम @property/ @methodटैग के लिए (यह प्रलेखन के लिए कैसे उपयोगी हो सकता है और कोड पूरा होने के दौरान वास्तविक IDE को लाने में कितनी मदद कर सकता है) का उपयोग करने के बारे में phpDocumentor का टिकट :


2
धन्यवाद, यह एक उचित सुझाव की तरह लग रहा है और यह निश्चित रूप से phpStorm में काम करता है, लेकिन मैं प्रत्येक वर्ग के शीर्ष पर @method की संभावित सैकड़ों पंक्तियों को लिखने के लिए थोड़ा निराश हूं। आप देखते हैं कि get_by_ * विधि निर्दिष्ट पैरामीटर द्वारा उस प्रकार की वस्तुओं को प्राप्त करने के लिए किसी भी ऑब्जेक्ट पैरामीटर द्वारा पूर्व निर्धारित किया जा सकता है। यहां तक ​​कि get_by_ _and_ की संभावना को छोड़कर मैं @methods140 विभिन्न वर्ग में लगभग 1500 के साथ समाप्त होगा । क्या प्रलेखन प्रदान करने के लिए अधिक सामान्य तरीका नहीं है?
रोब फॉरेस्ट

नहीं। सभी जादू विधियों को विशेष रूप से घोषित किया जाना चाहिए (जो इस तरह से दस्तावेजीकरण का मुख्य बिंदु है) - PHPDoc आंशिक नामों (जैसे get_by_*(int $id)) को नहीं समझता है । आईडीई (कोड निरीक्षण, पूरा नहीं हो रहा है!) के लिए आपके पास ऑल्ट सॉल्यूशन (चेतावनियाँ अक्षम करें) है। PhpDocumentor (या वैकल्पिक टूल) के लिए - मेरे लिए ज्ञात कोई समाधान नहीं (हो सकता है कि यह वहां हो, लेकिन मुझे इसके बारे में पता नहीं है)। आपके पास गिटबब का लिंक है - नया टिकट दर्ज करें और ऐसे "आंशिक नाम" मिलान कार्यक्षमता जोड़ने के लिए कहें - देखें कि वे क्या कहेंगे (सबसे अधिक संभावना खारिज कर दी जाएगी)। यदि इसे लागू किया जाएगा, तो आईडीई के पास बाद में भी हो सकता है।
लेजीऑन

github.com/phpDocumentor/phpDocumentor2/issues - लेकिन कृपया देखें कि क्या समान टिकट आपके पोस्ट करने से पहले मौजूद नहीं है।
लोज़ऑन

उस सब के लिए धन्यवाद। वर्तमान में इस संबंध में एक खुला टिकट है, लेकिन यह सब शांत हो गया है। मैंने वहाँ एक टिप्पणी अटकी है और हम देखेंगे कि इसका क्या आता है।
रॉब फॉरेस्ट

2
केवल संदर्भ के लिए, phpDocumentor का टिकट (इसलिए अन्य उपयोगकर्ता जानते हैं कि आप किस टिकट के बारे में बात कर रहे हैं? यह भी उत्तर में ही जोड़ा गया है): github.com/phpDocumentor/phpDocumentor2/issues/689
LazyOne

4

मूल प्रश्न से थोड़ा संबंधित:

आप इसे phpstorm मेटा फ़ाइल में भी परिभाषित कर सकते हैं। यहाँ कारखाना विधि के लिए एक उदाहरण है (v2016.3):

// Define in .phpstorm.meta.php
namespace PHPSTORM_META {
    $STATIC_METHOD_TYPES = [
        \Factory::create('') => [],
    ];
}

// Then use in code
$factory = new \Factory();
$user = $factory->create(\User::class);
// Here you get autocomplete.
$user->subscribe();

इस तरह से आपको जादू होने पर हर संभावना को रोकना नहीं है।

विवरण के लिए कुछ डॉक्स रखें


यह __call के साथ काम नहीं करता है। यह डॉक्यूमेंटेड और अमान्य PHP भी नहीं है। PHPStorm केवल उसी के लिए समर्थन प्रदान करता है जहाँ आपके पास सांख्यिकीय रूप से परिभाषित विधियाँ हैं जो इनपुट के आधार पर प्रकारों के मिश्रण को लौटाते हैं।
jgmjgm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.