PSR-0 और PSR-4 के बीच अंतर क्या हैं?


225

हाल ही में मैंने नामस्थानों के बारे में पढ़ा है और वे कैसे फायदेमंद हैं। मैं वर्तमान में लारवेल में एक परियोजना बना रहा हूं और क्लास मैप ऑटोलॉडिंग से नाम स्थान तक ले जाने की कोशिश कर रहा हूं। हालाँकि, मुझे समझ नहीं आ रहा है कि PSR-0 और PSR-4 के बीच वास्तविक अंतर क्या है।

कुछ संसाधन जो मैंने पढ़े हैं ...

मैं क्या समझता हूँ:

  • PSR-4 निर्देशिका विभाजकों को अंडरस्कोर नहीं बदलता है
  • संगीतकार के कुछ विशिष्ट नियमों के कारण निर्देशिका संरचना जटिल हो जाती है जो बदले में PSR-0 नामस्थान क्रिया बनाती है और इस प्रकार PSR-4 बनाया गया

अंतर की व्याख्या करने वाले उदाहरणों की सराहना की जाएगी।


3
PSR0 और PSR4 पढ़ें । वे हर एक विस्तार से बताते हैं।
सेवरी एम। ऑलसेन


4
☝️ किसी ने इस का सार एक जवाब के रूप टाइप करना चाहिए ... :)
deceze

1
IMO, PSR में अधिकांश भाग इस बात के बारे में हैं कि वे क्या नहीं पसंद करते हैं ...
Yousha Aleayoub

जवाबों:


283

वे बहुत समान हैं इसलिए यह आश्चर्यजनक नहीं है कि यह थोड़ा भ्रमित है। सारांश यह है कि PSR-0 में PEAR- शैली वर्ग नाम के लिए कुछ पश्चगामी संगतता विशेषताएं थीं, जो PSR-4 गिरा दिया, जैसे कि यह केवल नामांकित कोड का समर्थन करता है। उसके ऊपर PSR-4 आपको संपूर्ण नेमस्पेस को एक डायरेक्टरी स्ट्रक्चर के रूप में रखने के लिए बाध्य नहीं करता है, लेकिन केवल एंकर पॉइंट के बाद वाला हिस्सा।

उदाहरण के लिए यदि आप परिभाषित करते हैं कि Acme\Foo\नाम स्थान में लंगर डाला गया है src/, तो PSR-0 के साथ इसका मतलब है कि यह PSR-4 Acme\Foo\Barमें src/Acme/Foo/Bar.phpजबकि इसके लिए लगेगा, यह src/Bar.phpछोटी निर्देशिका संरचनाओं के लिए अनुमति देगा। दूसरी ओर कुछ पूरा निर्देशिका संरचना स्पष्ट रूप से देखने के लिए क्या जो नाम स्थान में है, इसलिए आप भी कह सकते हैं कि शामिल किया जाना पसंद Acme\Foo\है src/Acme/Fooसाथ PSR-4 जो कि आप की PSR-0 व्यवहार बराबर देता है ऊपर वर्णित है।

नई परियोजनाओं के लिए लंबी कहानी और अधिकांश इरादों और उद्देश्यों के लिए, आप PSR-4 का उपयोग कर सकते हैं और PSR-0 के बारे में सब भूल सकते हैं।


17
src/Bar.phpयदि आप कहते हैं, तो यह चुनता हैAcme\Foo\ => src/
सेलडेक

स्पष्टीकरण के लिए बहुत बहुत धन्यवाद!

4
PSR-4 PSR-0 की तुलना में धीमा है, है ना?
गुयेन

2
@NguyenLinh मुझे ऐसा नहीं लगता। यह वही काम करता है, लेकिन संभवतः निर्देशिकाओं के कम स्तर के साथ, इसलिए यह वास्तव में थोड़ा तेज हो सकता है। इसे मापो। आप एक पैकेज बना सकते हैं जिसे आप PSR-0 और PSR-4 के बीच बदल सकते हैं - मुझे नहीं लगता कि आपको कोई अंतर दिखाई देगा।
स्वेन

44

यहाँ प्रमुख अंतर हैं,

1. उदाहरण के लिए यदि आप परिभाषित करते हैं कि Acme\Foo\नाम स्थान में लंगर डाला गया है src/,

  • PSR-0 के साथ इसका मतलब है कि इसके लिए दिखेगा Acme\Foo\Barमेंsrc/Acme/Foo/Bar.php
  • जबकि PSR-4 में इसके लिए दिखेगा Acme\Foo\Barमें src/Bar.php(where Bar class is)

2. पीएसआर -4 निर्देशिका विभाजकों को अंडरस्कोर नहीं बदलता है

3. आप नाम स्थान के साथ PSR-4 का उपयोग करना पसंद करेंगे

4. PSR-0 तब भी काम नहीं करेगा, जब कक्षा का नाम फ़ाइल नाम से अलग हो, जैसे ऊपर दिए गए उदाहरण पर विचार करें:

  • Acme\Foo\Bar ---> src/Acme/Foo/Bar.php (बार क्लास के लिए) काम करेगा
  • Acme\Foo\Bar ---> src/Acme/Foo/Bar2.php(बार वर्ग के लिए) काम नहीं करेगा

1
आप निश्चित रूप से PSR-4 का उपयोग कर सकते हैं, बिना नाम-पत्र की लिपियों के साथ, इस तरह का कोई प्रतिबंध नहीं है और मैं इसका उपयोग करता हूं (मेरी पसंद का नहीं)
गलवानी

आपके 1. (पहले बिंदु) में PSR-4 केस के लिए बार कहां से आया?
cjmling

31

PSR-4 'सापेक्ष पथ', PSR-0, 'निरपेक्ष पथ' की तरह है।

जैसे

config:

'App\Controller' => 'dir/'

PSR-0 ऑटोलोड:

App\Controller\IndexController --> dir/App/Controller/IndexController.php

PSR-4 ऑटोलोड:

App\Controller\IndexController --> dir/IndexController.php

और PSR-0 और PSR-4 के बीच विवरण में कुछ और अंतर हैं, यहाँ देखें: http://www.php-fig.org/psr/psr-4/


10

Namespace / फ़ोल्डर सम्मेलन।

कक्षाओं को उनके नाम स्थान के अनुसार फ़ोल्डर्स में संग्रहीत किया जाना चाहिए।

सामान्य तौर पर, आप अपने रूट फ़ोल्डर में एक src / निर्देशिका बनाएंगे, जो विक्रेता / के समान स्तर पर बैठेगी, और अपनी परियोजनाओं को वहां जोड़ेगी। नीचे फ़ोल्डर संरचना का एक उदाहरण है:

.
+-- src
    |
    +-- Book 
    |   +-- History
    |   |   +-- UnitedStates.php - namespace Book\History;
    +-- Vehicle
    |   +-- Air
    |   |   +-- Wings
    |   |   |   +-- Airplane.php - namespace Vehicle\Air\Wings;
    |   +-- Road
    |   |   +-- Car.php - namespace Vehicle\Road;
+-- tests
    +-- test.php
+-- vendor

Psr-0 और psr-4 के बीच अंतर

psr -0

यह पदावनत है। को देखते हुए vendor/composer/autoload_namespaces.phpफ़ाइल आप नामस्थान और निर्देशिका है कि वे करने के लिए मैप किया जाता है देख सकते हैं।

composer.json

"autoload": {
        "psr-0": {
            "Book\\": "src/",
            "Vehicle\\": "src/"
        }
} 
  • के लिए खोज रहे बुक में \ इतिहास \ संयुक्त राज्य अमेरिका src / बुक /History/UnitedStates.php
  • के लिए खोज रहे वाहन में \ एयर \ पंख \ हवाई जहाज src / वाहन /Air/Wings/Airplane.php

psr -4

को देखते हुए vendor/composer/autoload_psr4.phpफ़ाइल आप नामस्थान और निर्देशिका है कि वे करने के लिए मैप किया जाता है देख सकते हैं।

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/",
        "Vehicle\\": "src/"
    }
}   
  • के लिए खोज रहे बुक में \ इतिहास \ संयुक्त राज्य अमेरिका src /History/UnitedStates.php
  • के लिए खोज रहे वाहन में \ एयर \ पंख \ हवाई जहाज src /Air/Wings/Airplane.php

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/Book/",
        "Vehicle\\": "src/Vehicle/"
    }
}    
  • के लिए खोज रहे बुक \ इतिहास \ संयुक्त राज्य अमेरिका src / बुक /History/UnitedStates.php
  • के लिए खोज रहे वाहन में \ एयर \ पंख \ हवाई जहाज src / वाहन /Air/Wings/Airplane.php

-4

यहां तक ​​कि जब मैंने कोशिश की लेकिन संगीतकार एक गड़बड़ है। अफसोस की बात है कि यह बाजार का एकमात्र विकल्प है।
क्यों एक गड़बड़ है ?.
यदि आप कोड के नियंत्रण में हैं तो संगीतकार का स्वतः पूर्ण काम करता है। हालाँकि, यदि आप एक अलग परियोजना का आयात कर रहे हैं, तो आप अपने आप को बहुत सारी शैलियों और फ़ोल्डरों को बनाने के तरीकों के साथ पाते हैं। उदाहरण के लिए, कुछ प्रोजेक्ट्स / कॉम्पैनी / src/class.php हैं जबकि अन्य कंपनी / क्लास हैं। पीपी और अन्य कंपनी / src / class / class.php हैं

मैंने एक पुस्तकालय बनाया जो इसे हल करता है:

https://github.com/EFTEC/AutoLoadOne (यह मुफ़्त है, एमआईटी)।

यह एक फ़ोल्डर के सभी वर्गों को स्कैन करके एक ऑटोइंक्लूड उत्पन्न करता है, इसलिए यह हर मामले में काम करता है (psr-0 psr-4, namespace के बिना कक्षाएं, कई वर्गों के साथ फ़ाइल ।।

संपादित करें: और फिर से, बिना किसी कारण के डाउनवोट किया गया। ;-)


कंपोज़र.जॉसन में क्लासमेट विकल्प के बारे में पढ़ें। getcomposer.org/doc/04-schema.md#classmap - आपके उत्तर को नीचा दिखाने का कारण हो सकता है।
पैट्रिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.