2012-05-10 16 views
82

मुझे नामस्थानों और use कथनों के साथ थोड़ी परेशानी हो रही है।PHP नामस्थान और "उपयोग"

मेरे पास तीन फाइलें हैं: 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 बयान कोशिश मैं:

Fatal error: Class 'Shape\Shape' not found in /Users/shawn/Documents/work/sites/workspace/shape/Circle.php on line 8

कोई मुझे इस मुद्दे पर एक छोटे से मार्गदर्शन दे सकते हैं?

+0

मैं इस पढ़ सकते हैं और अभी भी काफी यह नहीं मिलता है के बराबर है। क्या बाहरी फाइलों को उपयोग के साथ शामिल किया जाएगा? –

+0

इस विषय के बारे में भी - http: // stackoverflow।कॉम/प्रश्न/33341955/करता है-आयात-या-उपयोग-ऑर्डर-प्रभाव-कार्यक्षमता-इन-php – Peter

उत्तर

124

use operator कक्षाओं, इंटरफेस या अन्य नामस्थानों के नामों को उपनाम देने के लिए है। अधिकांश 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 ऑपरेटर autoloading साथ भ्रमित होने की नहीं है। एक ऑटोलोडर (उदाहरण के साथ spl_autoload_register) पंजीकृत करके एक वर्ग स्वत: लोड हो जाता है (include की आवश्यकता को अस्वीकार करता है)। उपयुक्त ऑटोलोडर कार्यान्वयन देखने के लिए आप PSR-4 पढ़ना चाहेंगे। आप, नामस्थान करने के लिए अपने कोड ऑर्डर करने के लिए बस कीवर्ड namespace का उपयोग की जरूरत है

+0

बहुत बढ़िया, मैं इसे जांचता हूं। धन्यवाद! –

+0

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

+0

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

4

सबसे आसान तरीका यह

डाल करने के लिए।

file1.php namespace foo\bar;

में

file2.php $obj = new foo\bar\myObj();


फिर भी एक छोटे से इस कहानी को और अधिक में - use कीवर्ड।

यदि आप फ़ाइल 2 use foo\bar as mypath में कहते हैं तो इसका मतलब है कि आपको फ़ाइल में कहीं भी foo\bar के बजाय mypath का उपयोग करने की आवश्यकता है। '

$obj = new mypath\myObj(); 

use foo\bar कहा यदि आप था कि यह use foo\bar as bar

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