PHP में कीवर्ड "उपयोग" कैसे काम करता है और क्या मैं इसके साथ कक्षाएं आयात कर सकता हूं?


136

मेरे पास एक क्लास वाली फाइल है Resp। पथ है:

C:\xampp\htdocs\One\Classes\Resp.php

और मेरे पास index.phpइस निर्देशिका में एक फाइल है:

C:\xampp\htdocs\Two\Http\index.php

इस index.phpफाइल में मैं एक क्लास को इंस्टेंट करना चाहता हूँ Resp

$a = new Resp();

मुझे पता है कि मैं एक कक्षा के साथ फ़ाइल को शामिल करने के लिए कीवर्ड requireया उपयोग कर सकता हूं include:

require("One\Classes\Resp.php");       // I've set the include_path correctly already ";C:\xampp\htdocs". It works.
$a = new Resp();

लेकिन मैं कक्षाओं का उपयोग किए बिना requireया आयात करना चाहता हूं include। मैं यह समझने की कोशिश कर रहा हूं कि useकीवर्ड कैसे काम करता है। मैंने कोशिश की कि कुछ भी काम न आए:

use One\Classes\Resp;
use xampp\htdocs\One\Classes\Resp;
use htdocs\One\Classes\Resp;
use One\Classes;
use htdocs\One\Classes;    /* nothing works */

$a = new Resp();

इसे कहते हैं:

Fatal error: Class 'One\Classes\Resp' not found in C:\xampp\htdocs\Two\Http\index.php

कीवर्ड कैसे काम करता है use? क्या मैं इसका उपयोग वर्गों को आयात करने के लिए कर सकता हूँ?


1
आप फ़ाइलों को आयात किए बिना नहीं कर सकते। कृपया प्रवाह न बदलें। इसके अलावा नामस्थान वास्तव में PHP में उपयोग नहीं किए जाते हैं। VB.NET की तरह
कोल जॉनसन

13
@ कोल-जॉनसन, आपसे सहमत नहीं हूँ सिम्फनी namespaceएस के आसपास बनाया गया है । वास्तव में अगर आप नाम स्थान का उपयोग नहीं करते हैं तो कोई भी सिम्फनी नहीं है
ग्रीन

जवाबों:


80

useकुछ भी शामिल नहीं है। यह केवल निर्दिष्ट नाम स्थान (या वर्ग) को वर्तमान दायरे में आयात करता है

यदि आप चाहते हैं कि कक्षाएं ऑटोलॉगेड हों - ऑटोलिडिंग के बारे में पढ़ें


@ जी-मैन यह पूछे गए बहुत सवालों के जवाब देता है।
zerkms

188

नहीं, आप useकीवर्ड के साथ एक वर्ग आयात नहीं कर सकते । आपको include/ requireबयान का उपयोग करना होगा । यहां तक ​​कि अगर आप एक PHP ऑटो लोडर का उपयोग करते हैं, तब भी ऑटोलैडर को आंतरिक includeया requireआंतरिक रूप से उपयोग करना होगा ।

उपयोग कीवर्ड का उद्देश्य :

एक मामले पर विचार करें जहां आपके पास एक ही नाम के साथ दो कक्षाएं हैं; आपको यह अजीब लगेगा, लेकिन जब आप एक बड़े एमवीसी संरचना के साथ काम कर रहे होते हैं, तब ऐसा होता है। इसलिए यदि आपके पास एक ही नाम के दो वर्ग हैं, तो उन्हें अलग-अलग नामस्थानों में रखें। अब विचार करें कि जब आपका ऑटो लोडर दोनों वर्गों (द्वारा require) लोड कर रहा है, और आप कक्षा की वस्तु का उपयोग करने वाले हैं। इस स्थिति में, कंपाइलर भ्रमित हो जाएगा कि किस क्लास ऑब्जेक्ट को दो के बीच लोड करना है। कंपाइलर को निर्णय लेने में मदद करने के लिए, आप useस्टेटमेंट का उपयोग कर सकते हैं ताकि यह निर्णय ले सके कि किस पर प्रयोग किया जाना है।

आजकल प्रमुख फ्रेमवर्क का उपयोग करते हैं includeया के requireमाध्यम से composerऔरpsr

1) संगीतकार

2) PSR-4 ऑटोलोडर

उनके माध्यम से जाने से आपको आगे बढ़ने में मदद मिल सकती है। आप किसी सटीक वर्ग को संबोधित करने के लिए अन्य उपनाम का भी उपयोग कर सकते हैं। मान लीजिए कि आपको एक ही नाम से दो कक्षाएं मिली हैं, Mailerदो अलग-अलग नामस्थानों के साथ कहें :

namespace SMTP;
class Mailer{}

तथा

namespace Mailgun;
class Mailer{}

और यदि आप एक ही समय में दोनों मेलर वर्गों का उपयोग करना चाहते हैं तो आप एक उपनाम का उपयोग कर सकते हैं।

use SMTP\Mailer as SMTPMailer;
use Mailgun\Mailer as MailgunMailer;

बाद में आपके कोड में यदि आप उन क्लास ऑब्जेक्ट्स को एक्सेस करना चाहते हैं तो आप निम्न कार्य कर सकते हैं:

$smtp_mailer = new SMTPMailer;
$mailgun_mailer = new MailgunMailer;

यह मूल वर्ग को संदर्भित करेगा।

कुछ भ्रमित हो सकते हैं कि तब समान वर्ग नाम नहीं हैं तब useकीवर्ड का कोई उपयोग नहीं है । ठीक है, आप __autoload($class)फ़ंक्शन का उपयोग कर सकते हैं जिसे स्वचालित रूप से कहा जाएगा जब useकथन को तर्क के रूप में उपयोग किए जाने वाले वर्ग के साथ निष्पादित किया जाता है और इससे आपको आवश्यकतानुसार उड़ान भरने पर क्लास को रन-टाइम पर लोड करने में मदद मिल सकती है।

वर्ग ऑटोलैडर के बारे में अधिक जानने के लिए इस उत्तर को देखें ।


सिर्फ एक अलग वर्ग के नाम का उपयोग क्यों न करें?
परमात्मा

15
@दिव्य। कक्षाएं तीसरे पक्ष के विक्रेताओं से हो सकती हैं
दिनो

3
@दिव्य। क्या होगा अगर दोनों टकराने वाले वर्ग 3 पार्टियों से हैं?
दिनो

2
@divine कन्वेंशन के द्वारा, नामस्थान <वेंडरनाम> / <पैकेजनेम होगा> इस तरह से यह पहले से ही हल हो गया है। अधिवेशन के बाद, पैकगिस्ट के लिए किसी और से उसी विक्रेता के नाम को स्वीकार करना असंभव है। और packagist.org PHP रिपॉजिटरी है जो पैकेज की कंपोजर स्थापना के लिए उपयोग किया जाता है।
Tpojka

1
@root कोई मायने नहीं रखता, यह सिर्फ रन टाइम बताता है कि क्या इस्तेमाल किया जाए। जैसे आप कार चला रहे हैं और सिग्नल बताता है कि आप आगे टकरा रहे हैं और आप टूट जाते हैं, जैसे useकि बयान यह बताएगा कि कंपाइलर लोड अब मेरे लिए है। मिल गया प्रिय!
राजन रावल

23

एक नाम स्थान क्या है इसे उखाड़ फेंकें नहीं ।

नेमस्पेस मूल रूप से केवल क्लास प्रीफिक्स (ऑपरेटिंग सिस्टम में डायरेक्टरी की तरह) है जो क्लास की विशिष्टता को सुनिश्चित करता है ।

इसके अलावा, चीजों को स्पष्ट करने के लिए, उपयोग कथन केवल आपके नामस्थान को अलग करने के लिए कुछ नहीं कर रहा है, इसलिए आप शॉर्टकट का उपयोग कर सकते हैं या एक ही नाम के साथ कक्षाएं शामिल कर सकते हैं लेकिन एक ही फ़ाइल में विभिन्न नामस्थान

उदाहरण के लिए:

// You can do this at the top of your Class
use Symfony\Component\Debug\Debug;

if ($_SERVER['APP_DEBUG']) {
    // So you can utilize the Debug class it in an elegant way
    Debug::enable();
    // Instead of this ugly one
    // \Symfony\Component\Debug\Debug::enable();
}

अगर आप जानना चाहते हैं कि PHP Namespaces और autoloading (पुराने तरीके के साथ-साथ कम्पोज़र के साथ नया तरीका) कैसे काम करता है, तो आप इस विषय पर मेरे द्वारा लिखे गए ब्लॉग पोस्ट को पढ़ सकते हैं: https://enterprise-level-php.com/ 2017/12/25 /-जादू-पीछे-autoloading-php-फ़ाइलों का उपयोग-composer.html


8

आपको कक्षा को वैसे भी शामिल करना / आवश्यक करना होगा, अन्यथा PHP को नाम स्थान के बारे में नहीं पता होगा। हालाँकि
आपको आवश्यक नहीं है कि इसे उसी फ़ाइल में किया जाए । आप इसे उदाहरण के लिए बूटस्ट्रैप फ़ाइल में कर सकते हैं। (या एक ऑटोलॉडर का उपयोग करें, लेकिन यह वास्तव में विषय नहीं है)


4

समस्या सबसे अधिक संभावना है कि आपको एक ऑटो लोडर का उपयोग करने की आवश्यकता होगी जो वर्ग का नाम लेगा (इस मामले में '\' द्वारा ब्रेक) और इसे निर्देशिका संरचना में मैप करें।

आप इस लेख को PHP की ऑटोलॉगिंग कार्यक्षमता पर देख सकते हैं । फ्रेमवर्क में इस प्रकार की कार्यक्षमता के कई कार्यान्वयन पहले से ही हैं।

मैं वास्तव में एक से पहले लागू किया है। यहाँ एक लिंक है


हालांकि इसके साथ एक समस्या है। इसे एक पूर्ण पथ का निर्माण करने की अनुमति देने के लिए एक पुनरावर्ती मॉडल की आवश्यकता है। अभी यह केवल एकल स्तर के नामस्थानों को संभालता है।
टायलर कार्टर

3

मैं ग्रीन से सहमत हूं, सिम्फनी को नेमस्पेस की जरूरत है, तो उनका उपयोग क्यों नहीं किया जाए?

यह है कि एक उदाहरण नियंत्रक वर्ग कैसे शुरू होता है:

नाम स्थान Acme \ DemoBundle \ नियंत्रक;

सिम्फनी \ बंडल \ फ्रेमवर्क का उपयोग करें \ नियंत्रक \ नियंत्रक \ नियंत्रक;

कक्षा में आपका स्वागत है नियंत्रक नियंत्रक का विस्तार {...}


3

क्या मैं इसका उपयोग वर्गों को आयात करने के लिए कर सकता हूँ?

आप इसे ऊपर के उदाहरणों के अलावा ऐसा नहीं कर सकते। आप लक्षणोंuse को आयात करने के लिए कक्षाओं के अंदर कीवर्ड का उपयोग भी कर सकते हैं :

trait Stuff {
    private $baz = 'baz';
    public function bar() {
        return $this->baz;
    }
}

class Cls {
    use Stuff;  // import traits like this
}

$foo = new Cls;
echo $foo->bar(); // spits out 'baz'

3

useकीवर्ड PHP में अलियासिंग के लिए है और यह कक्षाएं आयात नहीं करता। यह वास्तव में
1 में मदद करता है ) जब आपके पास अलग-अलग नामस्थानों में एक ही नाम के साथ कक्षाएं होती हैं
2) बार-बार लंबे वर्ग के नाम का उपयोग करने से बचें।


2

Namespace एक विशिष्ट फ़ाइल के लिए पथ को परिभाषित करने के लिए उपयोग किया जाता है जिसमें एक वर्ग उदा

namespace album/className; 

class className{
//enter class properties and methods here
}

फिर आप इस विशिष्ट वर्ग को इस तरह "कीवर्ड" का उपयोग करके किसी अन्य php फ़ाइल में शामिल कर सकते हैं:

use album/className;

class album extends classname {
//enter class properties and methods
}

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


2

"उपयोग" कीवर्ड का उपयोग नामस्थान शाब्दिकों को छोटा करने के लिए है। आप अलियासिंग और इसके बिना दोनों का उपयोग कर सकते हैं। उपनाम के बिना आपको पूर्ण नामस्थान के अंतिम भाग का उपयोग करना चाहिए।

<?php
    use foo\bar\lastPart;
    $obj=new lastPart\AnyClass(); //If there's not the line above, a fatal error will be encountered.
?>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.