समस्या निवारण "गैर-यौगिक नाम के साथ उपयोग विवरण ... का कोई प्रभाव नहीं है"


95

जब मैं use Blog;शीर्ष पर रखूं तो यह त्रुटि हो रही है ।

चेतावनी: गैर-यौगिक नाम 'ब्लॉग' के साथ उपयोग विवरण का इसमें कोई प्रभाव नहीं है ...

Blog मेरा नाम स्थान है जिसमें मेरे 3 वर्ग हैं: अनुच्छेद, सूची और श्रेणी और कुछ कार्य।

अगर मैं अपना स्टेटमेन्मेंट बदल देता हूं use Blog\Article;तो यह काम करता है ...

क्या मैं केवल उन नामस्थानों को निर्दिष्ट नहीं कर सकता, जिनका मैं उपयोग करना चाहता हूं? क्या मुझे कक्षाएं प्रदान करने की आवश्यकता है?

क्या होगा यदि मेरे पास उस नामस्थान के भीतर कार्य हैं? जब मैं उन्हें नामस्थान के बाहर बुलाता हूं, तो मुझे \Blog\हर एक के नाम के लिए मजबूर होना पड़ता है ...


नहीं, मैं किसी भी ढांचे का उपयोग नहीं कर रहा हूं
लेलकैट

1
जब मैंने अपनी फाइल घोषित की, namespace उसके बाद मेरे पास आया use Blah;
डेरेक इलुकुक

इसका यह भी मतलब हो सकता है कि 'ब्लॉग' पहले ही शामिल हो चुका है और आप इसे दूसरी बार उपयोग करने का प्रयास कर रहे हैं। यह सामान्य है यदि आप एक ऐसे ढांचे का उपयोग कर रहे हैं जो पहले से ही इसे श्रृंखला में शामिल करता है।
रु।

@DerekIllchuk यदि केवल यह एक उत्तर हो सकता है जिसे मैं बढ़ा सकता हूं। मुझे बहुत सिरदर्द से बचाया।
मैं इतनी कोशिश करता हूं, लेकिन मैं

जवाबों:


90

PHP का useC ++ के समान नहीं है using namespace; यह आपको एक उपनाम को परिभाषित करने की अनुमति देता है , एक नाम स्थान को "आयात" करने के लिए नहीं और इस प्रकार नामस्थान योग्यता को पूरी तरह से छोड़ देता है।

तो, आप कर सकते हैं:

use Blog\Article as BA;

... इसे छोटा करने के लिए, लेकिन आप इससे पूरी तरह से छुटकारा नहीं पा सकते।


नतीजतन, use Blogबेकार है, लेकिन मेरा मानना ​​है कि आप लिख सकते हैं:

use \ReallyLongNSName as RLNN;

ध्यान दें कि आपको एक अग्रणी \का उपयोग करना चाहिए ताकि पार्सर को यह जानने में मजबूर किया जा सके कि ReallyLongNSNameयह पूरी तरह से योग्य है। यह सच नहीं है Blog\Article, जो स्पष्ट रूप से पहले से ही नामस्थान की एक श्रृंखला है:

ध्यान दें कि नाम दिए गए नामों के लिए (नामस्थान विभाजक वाले पूरी तरह से योग्य नामस्थान नाम, जैसे Foo\Bar कि वैश्विक नामों के विपरीतFooBar , जैसे कि नहीं ), अग्रणी बैकस्लैश अनावश्यक है और अनुशंसित नहीं है, क्योंकि आयात नाम पूरी तरह से योग्य होना चाहिए, और संसाधित नहीं होते हैं। वर्तमान नामस्थान के सापेक्ष।


22
आह कि चूसता है। तो useबात वास्तव में बेकार है, हो सकता है कि इसके लिए एक परिचित हो :)
thelolcat

1
@thelolcat: इसके उपयोग हैं ... सिर्फ वही नहीं जो आप चाहते हैं। :) यह करता है जैसे कि यह एक कष्टप्रद सीमा हो सकता है लग रहे हैं।
लाइटवेट दौड़

7
यह उत्तर केवल गैर-नामांकित फ़ाइलों के लिए सही है। 1) एक नामांकित फ़ाइल में, useकथन में अग्रणी \ _ का उपयोग करने की आवश्यकता नहीं है , क्योंकि इसके तर्क हमेशा निरपेक्ष के रूप में देखे जाते हैं (यानी, वैश्विक नामस्थान से शुरू)। 2) use Blog;आवश्यक रूप से बेकार नहीं है: उदाहरण के लिए, किसी फ़ाइल नाम से Blog\Util\CLI, जैसे कि , यह आपको Blog\Entry::method()इसके बजाय लिखने में सक्षम करेगा \Blog\Entry::method()। ऐसा नहीं है कि यह वास्तव में आवश्यक है, लेकिन इसका प्रभाव पड़ता है। इस उपयोग के उदाहरण के लिए, नेटटे फ्रेमवर्क देखें।
Zilk

24

चूंकि यह प्रश्न Google पर इस त्रुटि के लिए पहले परिणाम के रूप में प्रकट होता है, मैं बताता हूं कि मैंने इसे कैसे तय किया।

मूल रूप से यदि आपके पास एक ढांचा है, तो कहें कि Yii2 का उपयोग आपको वर्गों की घोषणा करने के लिए किया जाएगा:

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}

आपको यह त्रुटि Use Yiiतब होगी जब इस वर्ग का कोई नामस्थान नहीं होगा।

चूंकि इस वर्ग का कोई नामस्थान नहीं है, इसलिए यह स्वचालित रूप से वैश्विक प्रतीक तालिका को विरासत में मिला है और इसलिए इसे परिभाषित करने जैसी चीजों की आवश्यकता नहीं है, बस इसे हटा दें।


हाँ! यह सब समझ में आया! :)
मेर्तिस ब्राइडिस

1
मेरे लिए, समस्या यह थी कि मैं वैश्विक नेमस्पेस से एक प्रतीक का उपयोग करने की कोशिश कर रहा था, उदाहरण के लिए, use \Passwordलेकिन php को यह पसंद नहीं है जब आप ऐसा करने की कोशिश करते हैं कि बिना किसी अन्य के, इसलिए भी use \Password as Passwordठीक काम करता है।
Kzqai

OOD के उपयोग के सुझाव के लिए डाउनवोट किया गया जब मॉडरेटर नामस्थानों के उपयोग के संबंध में अधिक सामान्य उत्तर की तलाश में था।
जोश हब्दास

1
@ जोश आप किस बारे में हैं? मुझे आपका अंतिम उत्तर भी नहीं मिला। आप यह कहते हुए चले गए हैं कि ऐसा नहीं है कि कुछ मॉडरेटर OOP ट्रोलिंग के बारे में कुछ लोगों की लिंक देने के लिए देख रहे थे
Sammaye

1
@ जोश (बीटीडब्लू मुझे इससे नफरत है जब लोग इस तरह के विचारों का संदर्भ देते हैं जैसे कि किसी प्रश्न का उत्तर देने के लिए आधिकारिक सामग्री)
सैममयी

6

usePHP में बयान वास्तव में कुछ में एक लंबे नाम स्थान कि थोड़ा आसान को पढ़ने के लिए हो सकता है उर्फ करने के लिए सिर्फ एक सुविधा है। यह वास्तव में किसी भी फाइल को शामिल नहीं करता है या कुछ और नहीं करता है, जो आपके विकास को प्रभावित करता है, सुविधा प्रदान करने के अलावा। चूंकि, Blogआपको किसी भी तरह की सुविधा नहीं मिल रही है। मैं सोच सकता था कि आप ऐसा कुछ कर सकते हैं

use \Blog as B;

और वह भी काम कर सकता है। ( यह तर्क दिया जा सकता है कि आप वास्तव में अस्पष्ट होकर यहां सुविधा खो देते हैं, लेकिन यह सवाल ऐसा नहीं है ) क्योंकि आप वास्तव में Blogनामस्थान को किसी अन्य चीज़ से जोड़ रहे हैं । Blog\Articleडॉक्स के अनुसार कार्यों का उपयोग करना :

// this is the same as use My\Full\NSname as NSname
use My\Full\NSname;

तो आपका स्निपेट इसके बराबर होगा:

use Blog\Article as Article;

1
Bजब तक आप सक्रिय रूप से अचूक कोड नहीं लिख रहे हैं या दूसरों के सिरदर्द का कारण बनने की इच्छा नहीं रखते हैं, तब तक कभी भी कॉल न करें ।
जोश हबदास

2

त्रुटि "उपयोग कथन ... का कोई प्रभाव नहीं है ..." भी पॉप अप करता है यदि आप वर्ग परिभाषा से पहले एक विशेषता का उपयोग करने का प्रयास करते हैं।

use My_trait; // should not be here

class My_class{
// use My_trait; should be here instead
}

2

यदि आप 'सिंटैक्स' के रूप में 'का उपयोग नहीं करना चाहते हैं

use \Blog as B;

फ़ाइल के लिए एक नाम स्थान परिभाषित करें

namespace anyname;

use Blog
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.