PHP के नामस्थान और "उपयोग"


120

मुझे नामस्थान और useबयानों से थोड़ी परेशानी हो रही है ।

मैं तीन फ़ाइलें: ShapeInterface.php, Shape.phpऔर Circle.php

मैं रिश्तेदार रास्तों का उपयोग करके ऐसा करने की कोशिश कर रहा हूं, इसलिए मैंने इसे सभी वर्गों में रखा है:

namespace Shape; 

मेरे सर्कल वर्ग में मेरे पास निम्नलिखित हैं:

namespace Shape;
//use Shape;
//use ShapeInterface;

include 'Shape.php';
include 'ShapeInterface.php';    

class Circle extends Shape implements ShapeInterface{ ....

यदि मैं उन includeकथनों का उपयोग करता हूं, जिनमें मुझे कोई त्रुटि नहीं है। यदि मुझे useप्राप्त होने वाले कथनों की कोशिश करें :

घातक त्रुटि: पंक्ति 8 में /User/shawn/Documents/work/sites/workspace/shape/Circle.php में कक्षा 'शेप' शेप नहीं मिली।

कृपया कोई मुझे इस मुद्दे पर थोड़ा मार्गदर्शन दे सकता है?


इस विषय से भी संबंधित - stackoverflow.com/questions/33341955/…
पीटर

जवाबों:


169

useऑपरेटर कक्षाएं, इंटरफेस या अन्य नामस्थान के नाम के उपनाम देने के लिए है। अधिकांश useकथन एक नामस्थान या वर्ग को संदर्भित करते हैं जिसे आप छोटा करना चाहते हैं:

use My\Full\Namespace;

के बराबर है:

use My\Full\Namespace as Namespace;
// Namespace\Foo is now shorthand for My\Full\Namespace\Foo

यदि useऑपरेटर का उपयोग किसी वर्ग या इंटरफ़ेस नाम के साथ किया जाता है, तो इसके निम्न उपयोग हैं:

// after this, "new DifferentName();" would instantiate a My\Full\Classname
use My\Full\Classname as DifferentName;

// global class - making "new ArrayObject()" and "new \ArrayObject()" equivalent
use ArrayObject;

useऑपरेटर के साथ भ्रमित होने की नहीं है Autoloadingincludeऑटोलैडर (जैसे के साथ spl_autoload_register) पंजीकरण करके एक वर्ग ऑटोलॉइड (आवश्यकता की उपेक्षा करना ) है। आप एक उपयुक्त ऑटोलैडर कार्यान्वयन को देखने के लिए PSR-4 पढ़ना चाह सकते हैं ।


इसलिए अगर मैं bootstrap.php नामक एक और फ़ाइल बनाता हूं और $ सर्कल = नया सर्कल () के साथ एक ऑटोलैडर को अंदर रखता हूं; इसमें Circle.php शामिल है, लेकिन मुझे एक त्रुटि मिल रही है: घातक त्रुटि: कक्षा 'आकार' में नहीं मिला ... / Line.php लाइन 6 पर। यह Circle.php लोड करने के लिए प्रकट होता है, लेकिन Shape.php को लोड नहीं किया गया है जैसे: क्लास सर्कल का आकार इम्प्लीमेंटेशन शेपइंटरफेस
शॉन नॉर्थ्रोप

यदि मैं उपरोक्त वर्गों से नाम स्थान को हटाता हूं तो ऑटोलैडर ठीक काम करता है। हालाँकि जब मेरे पास आकार वर्ग के इंटरफ़ेस में नाम स्थान है तो मुझे उपरोक्त त्रुटि मिलती है
शॉन नॉर्थ्रॉप

1
एक उदाहरण देने के लिए एक जिन्न बनाया । दुर्भाग्य से gists सबफ़ोल्डर नहीं हो सकता। Bootstrap.php को एक फोल्डर में रखें और अन्य कक्षाओं को 'शेप' नामक सबफ़ोल्डर में रखें।
cmbuckley

13

यदि आपको अपना कोड नामस्थानों में रखने की आवश्यकता है, तो केवल कीवर्ड का उपयोग करें namespace:

file1.php

namespace foo\bar;

File2.php में

$obj = new \foo\bar\myObj();

आप भी इस्तेमाल कर सकते हैं use। अगर file2 में आप डालते हैं

use foo\bar as mypath;

आपको फ़ाइल में कहीं भी उपयोग mypathकरने की आवश्यकता है bar:

$obj  = new mypath\myObj();

का उपयोग करना use foo\bar;बराबर है use foo\bar as bar;

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