নাম স্থান কী?


241

পিএইচপি নামস্থান কী?

সাধারণভাবে নেমস্পেসগুলি কী কী?

একটি উদাহরণ সহ একটি লেমন উত্তর দুর্দান্ত হবে।

উত্তর:


573

নেমস্পেসিং ফাংশন এবং ক্লাসগুলির জন্য স্কোপগুলি ভেরিয়েবলগুলির জন্য কী করে। এটি আপনাকে নামের কোনও সংঘর্ষের কারণ ছাড়াই একই প্রোগ্রামের বিভিন্ন অংশে একই ফাংশন বা শ্রেণীর নাম ব্যবহার করতে দেয়।

সাধারণ ভাষায়, কোনও ব্যক্তির নাম হিসাবে নেমস্পেসটি ভাবেন । "জন" নামে যদি দু'জন লোক থাকে তবে আপনি তাদের নামগুলি আলাদা করে বলতে তাদের ব্যবহার করতে পারেন।

পরিস্থিতি

মনে করুন আপনি এমন একটি অ্যাপ্লিকেশন লিখেছেন যা নামের একটি ফাংশন ব্যবহার করে output()। আপনার output()ফাংশনটি আপনার পৃষ্ঠায় থাকা সমস্ত HTML কোড গ্রহণ করে এবং এটি ব্যবহারকারীর কাছে প্রেরণ করে।

পরে আপনার অ্যাপ্লিকেশনটি বড় হয়ে যায় এবং আপনি নতুন বৈশিষ্ট্য যুক্ত করতে চান। আপনি একটি লাইব্রেরি যুক্ত করুন যা আপনাকে আরএসএস ফিড তৈরি করতে দেয়। এই গ্রন্থাগারটি output()চূড়ান্ত ফিড আউটপুট দেওয়ার জন্য একটি ফাংশনও ব্যবহার করে।

আপনি যখন কল করবেন তখন output()পিএইচপি কীভাবে জানবে যে আপনার output()ফাংশনটি ব্যবহার করতে হবে বা আরএসএসের লাইব্রেরির ফাংশনটি ব্যবহার করতে output()হবে? এটা হয় না। যদি না আপনি নামের স্থান ব্যবহার করেন।

উদাহরণ

আমরা দুটি output()ফাংশন থাকার কীভাবে সমাধান করব ? সহজ। আমরা প্রতিটি output()ফাংশনকে তার নিজস্ব নামের জায়গায় আটকে রাখি

এটি দেখতে এরকম কিছু দেখাবে:

namespace MyProject;

function output() {
    # Output HTML page
    echo 'HTML!';
}

namespace RSSLibrary;

function output(){
    # Output RSS feed
    echo 'RSS!';
}

পরে যখন আমরা বিভিন্ন ফাংশন ব্যবহার করতে চাই তখন আমরা ব্যবহার করব:

\MyProject\output();
\RSSLibrary\output();

বা আমরা ঘোষণা করতে পারি যে আমরা কোনও একটি নেমস্পেসে রয়েছি এবং তারপরে আমরা কেবল সেই নামস্থানটি কল করতে পারি output():

namespace MyProject;

output(); # Output HTML page
\RSSLibrary\output();

নেমস্পেস নেই?

আমাদের যদি নেমস্পেস না থাকে তবে আমাদের যখন কোনও লাইব্রেরি যুক্ত হয়েছিল তখন যে কোনও সময় আমাদের প্রচুর কোড (সম্ভাব্যভাবে) পরিবর্তন করতে হত, বা আমাদের ফাংশনটির নামগুলি অনন্য করে তুলতে ক্লান্তিকর উপসর্গ নিয়ে আসতে হবে। নেমস্পেসগুলির সাহায্যে, আমাদের নিজস্ব প্রকল্পগুলির সাথে তৃতীয় পক্ষের কোডটি মিশ্রণের সময় আমরা নামকরণের সংঘর্ষের মাথাব্যথা এড়াতে পারি।


কিছু কারণে আমি ভেবেছিলাম যে আপনি যদি ফাইল 1 তে নেমস্পেসগুলি ব্যবহার করেন তবে আপনার ফাইলটি ফাইল 2 এ অন্তর্ভুক্ত করতে হবে না বা অন্তর্ভুক্ত করতে হবে না। ইউনিট পরীক্ষায় দেখা গেছে যে এটি ঘটনা নয়।
অ্যারন বেল

1
আপনি চেক আউট করতে চাইতে পারেন @AaronBell autoloading
cednarski

21

একটি নেমস্পেস আপনাকে একটি নামের অধীনে কোডের একটি গোছা রাখতে দেয় এবং ক্লাস, ফাংশন এবং ধ্রুবকগুলির সাথে কোনও নামকরণ বিরোধ নয়।

এটা তোলে আপনার কোড করার অনুমতি দেয় বাস যে নামস্থান হবে।

পিএইচপি নেমস্পেসের স্তরগুলি দেখানোর জন্য কিছুটা বিতর্কিত চরিত্র \ ব্যবহার করে। লোকেরা অস্ত্র হাতে উঠেছিল কারণ এটি একটি পালানোর চরিত্র হিসাবেও ব্যবহৃত হয়।

পিএইচপি-তে নেমস্পেস ব্যবহার করতে, আপনার ফাইলের শীর্ষে এই জাতীয় কিছু ব্যবহার করুন।

namespace my\namespace;

নেমস্পেসের জন্য অফিসিয়াল পিএইচপি ডকুমেন্টেশনে আপনি আরও অনেক তথ্য পেতে পারেন ।


11

যেহেতু "নেমস্পেস" সম্পর্কে জেনে "ব্যবহার" কীওয়ার্ডটি সম্পর্কে জানতে আরও সহজ, তাই প্রথমে একটি বেসিক লারাভেল প্রকল্পটি দেখে নেমস্পেসটি ব্যাখ্যা করি।

নামে একটি কন্ট্রোলার ক্লাস রয়েছে: কন্ট্রোলআরএফপি যা পথে রয়েছে: অ্যাপ্লিকেশন / এইচটিটিপি / কন্ট্রোলারগুলি প্রকল্পের মূল ডিরেক্টরি থেকে আরও একটি নিয়ামক শ্রেণি রয়েছে: কন্ট্রোলআরপিপি , তবে এই পথটি রয়েছে: বিক্রেতা / প্রকল্পের মূল ডিরেক্টরি থেকে লারাভেল / ফ্রেমওয়ার্ক / এসসিআর / আলোকিত / রাউটিং

আপনি পিএইচপি করতে নতুন হন তবে আপনার উত্স কোডটি এখনও দেখার দরকার নেই কারণ এটি আপনাকে বিভ্রান্ত করতে পারে, পরিবর্তে আমাকে এর অংশটি ব্যাখ্যা করতে দিন যা আমরা যত্ন করি এবং আমাদের "নামস্থান" এবং "ব্যবহার বুঝতে" সাহায্য করবে "।

সুতরাং প্রকৃতপক্ষে, আমাদের প্রথম নিয়ামক শ্রেণি: অ্যাপ / এইচটিটিপি / কন্ট্রোলার / কন্ট্রোলআরপিপি- র দ্বিতীয় নিয়ামক শ্রেণীর বিক্রেতা / লারাভেল / ফ্রেমওয়ার্ক / এসসিআর / আলোকসজ্জা / রাউটিং / কন্ট্রোলআরএফপি ব্যবহার করা দরকার । কিছু গুরুত্বপূর্ণ রাউটিং কার্যকারিতা পরিচালনা করার জন্য এর সামগ্রীতে এর সামগ্রীতে অ্যাক্সেস পাওয়ার জন্য আসলে এই শ্রেণিকে প্রসারিত করতে হবে।

সুতরাং কিভাবে একটি শ্রেণি একই নাম আছে অন্য শ্রেণি প্রসারিত করতে পারেন? class Controller extends Controller? এই করা হবে না কাজ, যদি না সেখানে একটি উপায় এই দুটি শ্রেণীর পার্থক্য এবং যে কোথায় namespaceকুশলী এসে useশব্দ ব্যবহার, যার ফলে মিশন সম্পন্ন করার জন্য সাহায্য করে (ক্লাস; পদ্ধতি; ইন্টারফেস এবং ধ্রুবক), একই নামের সাথে একই সুযোগে।

এখন কোডে এটি কীভাবে হয়? খুব সহজ! যদি আমরা অ্যাপ্লিকেশন / এইচটিটিপি / কন্ট্রোলার / কন্ট্রোলআরএফপি উত্স কোডটি দেখি, আমরা শ্রেণীর নেমস্পেসের শীর্ষে দেখতে পাচ্ছি যে হিসাবে ঘোষণা করা হয়েছে:namespace App\Http\Controllersসুতরাং আপনি নিজের ক্লাসটিকে একটি নামস্থান দেবেন যাতে এখন অন্যান্য শ্রেণি দ্বারা এটি রেফারেন্স করা যায় this এটি প্রকল্পের মূল ডিরেক্টরি থেকে এই শ্রেণীর পাথের মতোই দেখায়, সামান্য পার্থক্য সহ এবং এটি "\" এর পরিবর্তে "/" (উইন্ডোগুলিতে কমান্ড প্রম্পট হিসাবে একই) এর ব্যবহার , তবে অন্য একটি পার্থক্য রয়েছে এবং এটিই মূলধনের সাথে অ্যাপ্লিকেশন that's 'স্পেস' নামে 'স্পেস' নামে 'স্পেস' নামক স্পেসের সাথে লোয়ারকেস 'এ' পথে। আরও মনে রাখবেন যে নেমস্পেসটি কেস-সংবেদনশীল।

সুতরাং নেমস্পেসটি পাথের চেয়ে পৃথক ধারণা, এটি যদি সহায়তা করে তবে পাথ কাঠামো অনুসরণ করতে পারে তবে শ্রেণি, পদ্ধতি, ইন্টারফেস বা ধ্রুবকের সঠিক পথ হতে হবে না উদাহরণস্বরূপ এটি দেখুন: বিক্রেতা / লারাভেল / কাঠামো /src/ ইলুমিনেট / রাউটিং / কনট্রোলআরএফপি উত্স কোড,

আমরা ক্লাসের শীর্ষে দেখতে পাই যে নামস্থানটি ঘোষিত হয়েছে: Illuminate\Routing

এখন আসুন " use" কীওয়ার্ডটি আমরা ব্যবহার করি, আমরা useআমাদের ক্লাসে যে ক্লাসটি ব্যবহার করতে চাই তার নির্দিষ্ট ক্লাস বা ফাংশন সম্পর্কে আমাদের ক্লাসকে সচেতন করতে " " "কীওয়ার্ডটি দেখুন

সুতরাং আমরা আমদানি করছি না বা কিছুই যুক্ত করছি না আমরা কেবল আমাদের ক্লাসকে জানিয়ে দিচ্ছি যে আমরা তাদের নির্দিষ্ট জায়গার নাম উল্লেখ করে নির্দিষ্ট শ্রেণি বা পদ্ধতি ব্যবহার করব, আসুন অ্যাপ / এইচটিটিপি / কন্ট্রোলার / কন্ট্রোলারএফপি উত্স কোডটি দেখে নেওয়া যাক , আপনি লাইনটি থেকে দেখতে পারেন: " use Illuminate\Routing\Controller as BaseController", লক্ষ্য শ্রেণীর জন্য নেমস্পেসেরuse পরে " " "কীওয়ার্ড (নোট করুন যে আলোকিত out রাউটিং \ কন্ট্রোলারএফপি এবং আলোকসজ্জা \ রাউটিং \ কন্ট্রোলার '। পিএফপি এক্সটেনশন ছাড়াই' বিনিময়যোগ্য)

একটি নির্দিষ্ট শ্রেণি, পদ্ধতি, ইন্টারফেস বা কনসেন্টস একটি উপাধি দেওয়ার জন্য আমরা " as" কীওয়ার্ডটি পাশাপাশি " " কীওয়ার্ডটি ব্যবহার করতে পারি যা অ্যাপ্লিকেশন / এইচটিটিপি / কন্ট্রোলারস / কন্ট্রোলার পিএফপিগুলিকে বেসকন্ট্রোলার হিসাবে আলোকিত \ রাউটিং \ কন্ট্রোলআরএফপি প্রসারিত করতে দেয় the লাইন: " "।useclass Controller extends BaseController


9

অন্যান্য প্রোগ্রামিং ভাষায় নেমস্পেসের মতো কৌশল রয়েছে (জাভাতে থাকা প্যাকেজগুলির মতো)। তারা প্রকল্পে একই নামে একাধিক শ্রেণীর ক্লাস করতে সক্ষম হয়।

পিএইচপি ডকুমেন্টেশন ( http://www.php.net/manual/en/language.namespaces.rationale.php ) থেকে:

নাম স্থান কী? বিস্তৃত সংজ্ঞাতে নেমস্পেসগুলি হ'ল এনক্যাপসুলেটিং আইটেমগুলির একটি উপায়। এটি অনেক জায়গায় একটি বিমূর্ত ধারণা হিসাবে দেখা যেতে পারে। উদাহরণস্বরূপ, কোনও অপারেটিং সিস্টেমের ডিরেক্টরিগুলিতে গ্রুপ সম্পর্কিত ফাইলগুলিতে পরিবেশন করা হয় এবং সেগুলির মধ্যে থাকা ফাইলগুলির একটি নেমস্পেস হিসাবে কাজ করে। একটি কংক্রিট উদাহরণ হিসাবে, foo.txt ফাইলটি ডিরেক্টরি / হোম / গ্রেগ এবং / হোম / অন্যান্য উভয়তেই বিদ্যমান থাকতে পারে তবে foo.txt এর দুটি কপি একই ডিরেক্টরিতে সহ-বিদ্যমান থাকতে পারে না। এছাড়াও, / home / greg ডিরেক্টরি এর বাইরে foo.txt ফাইল অ্যাক্সেস করার জন্য আমাদের /home/greg/foo.txt পেতে ডিরেক্টরি বিভাজক ব্যবহার করে ফাইলের নামের ডিরেক্টরিটি অবশ্যই প্রিন্ট করতে হবে। এই একই নীতি প্রোগ্রামিং জগতের নামস্থানগুলিতে প্রসারিত।


1
জাভার সাথে তুলনা করা একটি খারাপ ধারণা। জাভাতে প্যাকেজ রয়েছে এবং প্যাকেজ-দৃশ্যমানতার ক্লাস রয়েছে। সুরক্ষিত সদস্যদের দৃশ্যমানতা এটি যে প্যাকেজটি অ্যাক্সেস করে তার উপর নির্ভর করে।
আর্টেফ্যাক্টো

1
এগুলি প্যাকেজের সমান নয় তবে তারা একই ধারণা ভাগ করে দেয়।
য়কৌবয়

যেহেতু প্রশ্নটি জিজ্ঞাসা করে যে সাধারণভাবে नेमস্পেসগুলি কী, উত্তরটি উপলব্ধি করে।
কিমলালুনো

@ কিয়াম তারা একটি ধারণা ভাগ করে নিল - অ-সংঘাতের শ্রেণীর নাম। তারা দৃশ্যমানতার ধারণা ভাগ করে না।
আর্টেফ্যাক্টো

@ আর্টেফ্যাক্টো: কউ-বয় বলেনি যে দুটি ভাষায় নাম স্থান একই ছিল।
কিমলালুনো

4

অনেকগুলি ডিরেক্টরি এবং ফাইলগুলির মতো , পিএইচপি-র নেমস্পেস গ্রুপ শ্রেণি , ফাংশন , ইন্টারফেস এবং ধ্রুবকগুলিকে পরিবেশন করে ।

উদাহরণ:

Filesystem      |   PHP Namespace
----------------|------------------
/Dir/File.txt   |  \Namespace\Class

এটি বিশ্বব্যাপী স্থান থেকে আইটেমগুলি মোড়ানো করার একটি উপায় সরবরাহ করে এবং কোনও প্রোগ্রামে নাম সংঘর্ষের কারণ না করে প্লেট আইটেমের নাম ব্যবহারের অনুমতি দেয়। এটি পিএইচপি 5.3.0, পিএইচপি 7 এ সমর্থিত।

তবে পিএইচপি নেমস্পেস এবং ইউনিক্স ভিত্তিক ফাইল সিস্টেমের মধ্যে সাদৃশ্যটির কিছু সীমা রয়েছে:

                          | Filesystem            |        PHP Namespace
--------------------------|-----------------------|-------------------------
Cas sensitive             |       No              |        Yes                
--------------------------|-----------------------|-------------------------
Name with plain number    |       Yes             |        No
--------------------------|-----------------------|-------------------------
Path level                |       Yes             |        Yes   
--------------------------|-----------------------|-------------------------
Plain metacharacters name |       Yes             |        No        

নীতিটি প্রোগ্রামিং শব্দের মধ্যে নামস্থান পর্যন্ত প্রসারিত।


3

একটি নেমস্পেস ডিরেক্টরি হিসাবে কাজ করে। আপনি কীভাবে পিতামাতাদের (বা অন্য কোনও) ডিরেক্টরিতে ফাইলের নামের সাথে একই নামে ফাইলগুলিকে ফাইল রাখতে পারেন? ভাল, একটি নেমস্পেস আপনাকে ভেরিয়েবল, ফাংশন এবং ক্লাসগুলির জন্য একটি অ্যাপ্লিকেশনের মধ্যে এটি করতে দেয়।

অবিচ্ছিন্ন স্ট্যাটিস ফাংশনগুলির জন্য পিএইচপিতে কিছুটা আগে একটি ট্রেন্ড হয়েছিল। এই ফাংশনগুলির মধ্যে যে কোনওটিকে কল করার একমাত্র উপায় ছিল শ্রেণীর নামের সাথে একটি কল উপসর্গ করে। এটি নেমস্পেসে একটি আদিম প্রচেষ্টা ছিল, তবে খুব বেশি সুবিধা সহ নয়।


2

একটি নেমস্পেস মূলত আপনাকে একটি ধারকটিতে কোড রাখতে দেয়। এটি একই নামে ভাগ করে নেওয়া দুটি ফাংশন (পাশাপাশি শ্রেণি এবং ভেরিয়েবল) এর সাথে সমস্যাগুলি প্রতিরোধ করবে।

কোডগুলির টুকরা একই নাম ভাগ করে নিয়ে সমস্যাগুলি রোধ করতে বৃহত্তর অ্যাপ্লিকেশনগুলি কাজ করার সময় এটি কার্যকর হয়।

উদাহরণস্বরূপ, ধরুন আমরা "TheMessage" নামক দুটি ফাংশন চেয়েছিলাম। এই উভয় পৃথক পৃথক বার্তা মুদ্রণ (প্রতিধ্বনি) হবে। সাধারণত, এটি সিনট্যাক্স ত্রুটির কারণ হতে পারে কারণ আপনার একই নাম ভাগ করে নেওয়ার দুটি ফাংশন থাকতে পারে না।

এটি ঠিক করার জন্য, আপনি এই ফাংশনগুলি পৃথক নেমস্পেসে রাখতে পারেন। এটি আপনাকে কোনও ত্রুটি ছাড়াই উভয় ফাংশন ব্যবহার করার অনুমতি দেবে।


2

নেমস্পেস অনেকগুলি জিনিসকে একটি প্যাকেজে প্যাকেজ করার মতো। একটি ড্রয়ার হিসাবে একটি নেমস্পেসের কল্পনা করুন যাতে আপনি সমস্ত ধরণের জিনিস রাখতে পারেন: একটি পেন্সিল, একজন শাসক, একটি কাগজের টুকরো এবং আরও কিছু। একে অপরের আইটেম ব্যবহার এড়াতে, আপনি ড্রয়ারগুলি লেবেল করার সিদ্ধান্ত নিয়েছেন যাতে এটি কার স্পষ্ট তা স্পষ্ট।


0

নেমস্পেস কোডের বদ্ধ গ্রুপের জন্য ব্যবহার করা হয় যাতে তারা নাম বিবাদ ছাড়াই বিভিন্ন জায়গায় ব্যবহার করতে পারে। এটিকে jQuery হিসাবে কোনও বিরোধের পদ্ধতি হিসাবে ভাবেন না এবং আপনি এটি আরও ভাল বুঝতে পারবেন।


"JQuery কোনও বিরোধের পদ্ধতি নয়" বলতে কী বোঝ? কীভাবে এটি পিএইচপি সম্পর্কিত?
নিকো হাজে 14 ই

0

একটি প্রোগ্রামে নামগুলি নিয়ন্ত্রণ করার জন্য একটি নেমস্পেস একটি সহজ সিস্টেম।
এটি নিশ্চিত করে যে নামগুলি অনন্য এবং কোনও বিবাদ সৃষ্টি করবে না।


আপনি কোন ধরণের "নাম" সম্পর্কে কথা বলছেন?
নিকো হায়েস

0

আপনার তৈরি কোড এবং অভ্যন্তরীণ পিএইচপি ক্লাস / ফাংশন / ধ্রুবক বা তৃতীয় পক্ষের ক্লাস / ফাংশন / ধ্রুবকগুলির মধ্যে নাম সংঘর্ষ এড়াতে আপনি নেমস্পেস ব্যবহার করতে পারেন। নেমস্পেসগুলিতে উত্স কোডের পঠনযোগ্যতা উন্নত করে প্রথম সমস্যা হ্রাস করার জন্য ডিজাইন করা অতিরিক্ত_ লং_নামের নাম (বা সংক্ষিপ্তকরণ) করার ক্ষমতাও রয়েছে।

যেমনটি আমরা সবাই জানি, পিএইচপিতে নেমস্পেস এবং বৈশিষ্ট্যগুলি নতুন নয়, তবে এখনও অনেক পিএইচপি বিকাশকারী তাদের জটিলতার কারণে এই দুর্দান্ত ধারণাগুলি ব্যবহার করেন না। সুতরাং, এই পোস্টে। আমি উদাহরণ দিয়ে তাদের সাফ করার চেষ্টা করব। নাম স্থান এবং বৈশিষ্ট্য কি?

আপনার কোডটি পুনরায় ব্যবহারযোগ্য এবং এক্সটেনসিবল করার জন্য আপনি কীভাবে এগুলি আপনার কোডে প্রয়োগ করতে পারেন?

নেমস্পেসের সুবিধা

আপনার তৈরি কোড এবং অভ্যন্তরীণ পিএইচপি ক্লাস / ফাংশন / ধ্রুবক বা তৃতীয় পক্ষের ক্লাস / ফাংশন / ধ্রুবকগুলির মধ্যে নাম সংঘর্ষ এড়াতে আপনি নেমস্পেস ব্যবহার করতে পারেন।

নেমস্পেসগুলিতে উত্স কোডের পঠনযোগ্যতা উন্নত করে প্রথম সমস্যা হ্রাস করার জন্য ডিজাইন করা অতিরিক্ত_ লং_নামের নাম (বা সংক্ষিপ্তকরণ) করার ক্ষমতাও রয়েছে। আসুন একটি উদাহরণ সহ নেমস্পেসগুলি বুঝতে পারি। htdocs (xampp) বা www (xwamp) এ "php_oops" ফোল্ডারের নাম তৈরি করুন "নেমস্পেসস" নামের রুট ডিরেক্টরিতে একটি নতুন ফোল্ডার তৈরি করুন এবং তারপরে নেমস্পেসেস ফোল্ডারে একটি ফাইল index.php তৈরি করুন।

<?php
// FilePath:- namespaces/index.php

// let's say, we have two classes in index,
// here, these two classes have global space
class A 
{ 
   function __construct()
   { 
      echo "I am at Global space, Class A";
   }
}
class B
{
   function __construct()
   {
      echo "I am at Global space, Class B";
   }
}
// now create an object of class and 
$object = new A; // unqualified class name
echo "<br/>";
$object = new \B; // fully qualified class name
// output: 
I am at Global space, Class A
I am at Global space, Class B

তথ্যসূত্র- https://medium.com/@akgarg007/php-laravel-namespaces-and-traits-01-9540fe2969cb


1
দয়া করে বিভিন্ন সাইটে আপনার নিজের সামগ্রীর সাথে লিঙ্ক করার বিষয়ে সতর্ক হন, আপনি কোনও স্প্যামার হতে চান না । আপনার এখানে বেশিরভাগ সামগ্রীর অন্তর্ভুক্ত হওয়া উচিত এবং লিঙ্কটি কেবল একটি রেফারেন্স হিসাবে ব্যবহার করুন।
ধর্ম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.