পিএইচপি-তে নেমস্পেস ব্যবহারের উদাহরণ। পিএইচপি-তে নামস্থান ব্যাখ্যা করা হয়েছে। নামস্থান: বর্ণনার একাধিক সুযোগ
আমি সম্প্রতি একটি নেমস্পেসে আমার প্রকল্পকে এনক্যাপসুলেট করেছি এবং সঠিক ডকুমেন্টেশনের অভাবের সমস্যায় পড়েছি। আমরা যা খুঁজে বের করতে পেরেছি তার সবকিছুই আনুমানিক 2009 সালের, এবং এটি প্রায় 2012... পাওয়া উপাদানে, এমন অনেকগুলি অ-কার্যকর জায়গা রয়েছে যা এমন কিছু ব্যবহার করে যা php-এর বর্তমান সংস্করণে নেই৷ এই প্রসঙ্গে, আমি এই বিষয়ে কিছু আলোকপাত করতে চাই।
সুতরাং, একটি নামস্থান বা নামস্থান কি? মহান উইকিপিডিয়া তাদের এইভাবে সংজ্ঞায়িত করে:
নেমস্পেস হল একটি সেট, যার মানে হল একটি মডেল, বিমূর্ত স্টোরেজ বা পরিবেশ যা অনন্য শনাক্তকারীর (অর্থাৎ নাম) লজিক্যাল গ্রুপিংয়ের জন্য তৈরি করা হয়েছে। একটি নামস্থানে সংজ্ঞায়িত একটি শনাক্তকারী সেই নামস্থানের সাথে যুক্ত। একই শনাক্তকারী স্বাধীনভাবে একাধিক স্থানে সংজ্ঞায়িত করা যেতে পারে। এইভাবে, একটি নামস্থানে সংজ্ঞায়িত একটি শনাক্তকারীর সাথে যুক্ত একটি মান অন্য নামস্থানে সংজ্ঞায়িত একই শনাক্তকারীর মত একই (বা বরং ভিন্ন) অর্থ থাকতে পারে (বা নাও হতে পারে)। নামস্থান-সচেতন ভাষাগুলি এমন নিয়মগুলিকে সংজ্ঞায়িত করে যা নির্দেশ করে যে কোন নামস্থান কোন শনাক্তকারীর অন্তর্গত (অর্থাৎ, এর সংজ্ঞা) উইকি।
সব পরিষ্কার? এটা আসলে সহজ. সংস্করণ 5.3 এর আগে, php-এ শুধুমাত্র দুটি স্পেস ছিল - গ্লোবাল (যেটিতে আপনার প্রধান কোডটি কার্যকর করা হয়েছিল) এবং স্থানীয় (যেটিতে ফাংশন ভেরিয়েবলগুলি সংজ্ঞায়িত করা হয়েছিল)।
সংস্করণ 5.3 থেকে সবকিছু পরিবর্তিত হয়েছে। এখন আপনি আপনার নামস্থান সংজ্ঞায়িত করতে পারেন যেখানে আপনার ক্লাস, পদ্ধতি ইত্যাদি বিদ্যমান থাকবে।
আমি আশা করি এটি একটু পরিষ্কার হয়ে গেছে।
আমি বিশেষভাবে একই ক্লাসের নাম দিয়েছি। যেহেতু তারা বিভিন্ন স্থানে সংজ্ঞায়িত করা হয়েছে, একই নাম থাকা সত্ত্বেও তারা দুটি ভিন্ন শ্রেণী। মূল স্ক্রিপ্ট এখনও গ্লোবাল স্পেসে কাজ করে, এখানে কিছুই পরিবর্তিত হয়নি এবং ক্লাস এবং ফাংশন এখনও এটিতে সংজ্ঞায়িত করা যেতে পারে। তাহলে স্পেস কি তাহলে? প্রথমত, নিশ্চিত করুন যে আপনি যখন কিছু ফ্রেমওয়ার্ক বা লাইব্রেরি সহ একটি ফাইল অন্তর্ভুক্ত করবেন, আপনার ক্লাসগুলি ফ্রেমওয়ার্কের ক্লাসগুলিকে ওভাররাইড করবে না বা এর বিপরীতে।
আপনার নামস্থানে সংজ্ঞায়িত ক্লাসগুলি ব্যবহার করার জন্য, আপনাকে সঠিক জায়গায় গ্লোবাল ওয়ানে আপনার সংজ্ঞায়িত স্থান আমদানি করতে হবে (আমি সাধারণত ফাইলের শুরুতে এটি করতে পছন্দ করি) এটি করার জন্য, use কীওয়ার্ডটি ব্যবহার করুন
মনোযোগ:কিছু কারণে php কীওয়ার্ড ব্যবহারের অনুমতি দেয় না ব্যবহারকন্ডিশন ব্লক এবং লুপ
আসুন ছবিগুলি থেকে উদাহরণ নেওয়া যাক এবং কোডে এটি প্রয়োগ করি:
মনোযোগ:নেমস্পেস কীওয়ার্ডটি অবশ্যই ফাইলের একেবারে শুরুতে অবস্থিত হতে হবে, এর পরপরই php
ফাইল A.php
php namespace A { class A { public static function say() { echo "Я пространство имен А"; } } }
B.php ফাইল
php namespace B { class A { public static function say() { echo "Я пространство имен B"; } } }
একটি বিকল্প সিনট্যাক্স সম্ভব:
php namespace A; class A { public static function say() { echo "Я пространство имен А"; } }
প্রতিটি নামস্থান একটি পৃথক ফাইলে ঘোষণা করার সুপারিশ করা হয়। যদিও এটি একটিতে সম্ভব, এটি কঠোরভাবে সুপারিশ করা হয় না!
এখন তৃতীয় ফাইলে যাওয়া যাক, যেখানে আমাদের প্রধান স্ক্রিপ্ট কাজ করবে
index.php
php
require_once "A.php";
require_once "B.php";
use A\A;
use B\A;
দেখে মনে হবে এটি একটি সুবিধা, শুধুমাত্র আরও কোড যোগ করা হয়েছে, তবে এটি সম্পূর্ণ সত্য নয়, একটু এগিয়ে আমি একটি অটোলোড ক্লাসের একটি উদাহরণ দেব, যার সাথে ক্লাসের সাথে ফাইলগুলিকে সংযুক্ত করার লাইনগুলি অপ্রয়োজনীয় হবে।
এখন আমাদের ক্লাস তাকান.
php
require_once "A.php";
require_once "B.php";
use A\A;
use B\A;
A\A::say();
B\A::say();
মনোযোগ:পিএইচপি নামস্থানে স্কোপ রেজোলিউশন অপারেটর (::) ব্যবহার করে অনুমতি নেই! স্ট্যাটিক ক্লাস পদ্ধতি এবং ধ্রুবক অ্যাক্সেস করার জন্য এটি উপযুক্ত একমাত্র জিনিস। প্রথমে তারা নামস্থানের জন্য এটি ব্যবহার করতে চেয়েছিল, কিন্তু তারপরে উদ্ভূত সমস্যার কারণে তারা এটির বিরুদ্ধে সিদ্ধান্ত নেয়। অতএব, A::A::say(); অবৈধ এবং এর ফলে একটি ত্রুটি হবে।
নামস্থানের জন্য আপনাকে অবশ্যই ব্যাকস্ল্যাশ অক্ষর "\" ব্যবহার করতে হবে
মনোযোগ:ভুল বোঝাবুঝি এড়াতে, স্ট্রিং-এ ব্যবহার করার সময় এই অক্ষরটিকে এড়িয়ে যাওয়া প্রয়োজন: "\\"
নেমস্পেস একে অপরের ভিতরে নেস্ট করা যেতে পারে, আসুন আমাদের A.php ফাইলে যোগ করি:
php
namespace A
{
class A
{
public static function say()
{
echo "Я пространство имен А";
}
}
}
namespace A\subA
{
class A
{
public static function say()
{
echo "Я подпространство имен А";
}
}
}
এবং সূচকে আমরা নিম্নলিখিতগুলি লিখব:
php
require_once "A.php";
require_once "B.php";
use A\A as A;
use B\A as B;
use A\subA as sub
A::say();
A::say();
sub::say();
একটি গুরুত্বপূর্ণ বিষয় হল আমদানি করা স্থানগুলির জন্য উপনাম ব্যবহার করা। আপনি A\subA::say(); আপনি সম্মত হবেন যে প্রতিবার স্পেসগুলিতে সম্পূর্ণ পাথ লেখা কঠিন; এটি এড়ানোর জন্য, উপনামগুলি চালু করা হয়েছিল। কম্পাইল করার সময়, নিম্নলিখিতগুলি ঘটবে: alias sub-এর পরিবর্তে, A\subA প্রতিস্থাপিত হবে, তাই আমরা A\subA::say();
গ্লোবাল স্পেসে সংজ্ঞায়িত ফাংশন কল করার সময় কি হবে? পিএইচপি প্রথমে আপনি যেখানে কাজ করছেন সেই স্থানের মধ্যে একটি ফাংশন সন্ধান করে এবং যদি এটি খুঁজে না পায় তবে এটি বিশ্বব্যাপী পরিসরে চলে যায়। অবিলম্বে নির্দেশ করার জন্য যে আপনি একটি গ্লোবাল ফাংশন ব্যবহার করছেন, আপনাকে অবশ্যই এটির আগে একটি ব্যাকস্ল্যাশ দিতে হবে।
স্পেস থেকে অটোলোডিং ক্লাসের সমস্যা এড়াতে, ফাইল সিস্টেমকে স্পেসগুলির সংগঠনের অনুরূপভাবে সংগঠিত করতে হবে। উদাহরণস্বরূপ, আমাদের একটি রুট ফোল্ডার ক্লাস রয়েছে, যেখানে আমাদের ক্লাসগুলি সংরক্ষণ করা হবে, তারপরে আমাদের স্পেসগুলি নিম্নরূপ সংগঠিত করা যেতে পারে
ক্লাস\A\A.php
classes\A\sub\A.php (সাব সাবস্পেস একটি পৃথক ফাইলে স্থাপন করা হবে)
ক্লাস\B\B.php
PHP এর একটি ম্যাজিক ধ্রুবক __NAMESPACE__ রয়েছে যা বর্তমান স্থানের নাম ধারণ করে।
এবং এখন অটোলোডিং সম্পর্কে।
নীচের ক্লাসটি আমার নয়, আমি এটিকে কাজ করেছি এবং এটিকে কিছুটা উন্নত করেছি, এখান থেকে নেওয়া হয়েছে।মনোযোগ:আপনার ক্লাস লোড করার জন্য, ক্লাসের নাম অবশ্যই ফাইলের নামের সাথে মিলবে!
".$ ফাইল।" in " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("connected " .$filepath)); $flag = FALSE; require_once($filepath); বিরতি; ) অটোলোডার::রিকারসিভ_অটোলোড($ফাইল, $পাথ2, &$ফ্ল্যাগ); ) ) ক্লোসিডর($হ্যান্ডেল); ) ) প্রাইভেট স্ট্যাটিক ফাংশন StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"]।" /Log/Log.html"; $file = fopen($dir, "a"); flock($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y H:i:s")।"
║
" .PHP_EOL)); flock($file, LOCK_UN); fclose ($file); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload");)
আপনি যদি লোড করার জন্য আসা ক্লাসগুলির নামগুলি দেখেন তবে আপনি দেখতে পাবেন যে প্রতিটি ক্লাসের আগে ব্যবহারে নির্দিষ্ট নামস্থান থেকে একটি উপসর্গ রয়েছে। এই কারণেই আমি নামস্থানের অনুরূপ ডিরেক্টরিগুলিতে ফাইলগুলির অবস্থান ব্যবহার করার পরামর্শ দিই; এটি এক বা দুটি পুনরাবৃত্তিতে অনুসন্ধানের গতি বাড়ায়।
এখন আমাদের সূচক এভাবে লেখা যেতে পারে:
php
require_once "Autoloader.php";
use Autoloader as Autoloader;
use A\A as A;
use B\A as B;
use A\subA as sub
A::say();
A::say();
sub::say();
এখন আপনি যে সমস্ত ক্লাস এবং ইন্টারফেস ব্যবহার করবেন তা স্বয়ংক্রিয়ভাবে লোড হবে।
স্পেস সহ ভাষার কিছু গতিশীল ক্ষমতা প্রদর্শন করতে, আসুন অন্য একটি শ্রেণী ঘোষণা করি:
test.php
php
namespace mySpace
{
class test
{
__construct()
{
//конструктор;
}
function sayName($name)
{
echo "Привет " . $name;
}
static function sayOther()
{
echo "статичный вызов";
}
}
}
Index.php
php
require_once "Autoloader.php";
use Autoloader as Autoloader;
use mySpace\test as test
//можно, например сделать так
$class = "test";
//приведет к вызову конструктора
$obj = new $class;
$obj->sayName("পরীক্ষা"); //অথবা আপনি এই পরীক্ষাটি করতে পারেন\sayName("test2"); //অথবা এই $obj::sayName("test"); //অথবা আপনি এই পরীক্ষাটি করতে পারেন::sayName("test2");
আমি আশা করি যে আমার নিবন্ধটি কারও কাজে লাগবে।
PHP, সংস্করণ 5.3 দিয়ে শুরু করে, আমাদের নামস্থান দিয়েছে। তারপর থেকে, এই নামস্থানটি কীভাবে ব্যবহার করা যায় তা নিয়ে কিছু অলস এবং কিছু উত্তপ্ত আলোচনা চলছে?
কিছু ফ্রেমওয়ার্ক, যেমন সিম্ফনি, লারাভেল, এবং অবশ্যই, জেন্ড, এই প্রযুক্তি গ্রহণ করেছে।
এই সব কমবেশি MVC স্কিমের সাথে খাপ খায়। একটি অবশেষ, সম্ভবত চিরন্তন, বিতর্ক: আবেদনের প্রধান বিবাহের জুটি কি হওয়া উচিত - মডেল এবং কন্ট্রোলার?
কেউ কেউ আমাদের বলে যে মডেলটি শক্ত এবং মোটা হওয়া উচিত এবং তার সাথে একটি পাতলা এবং পাতলা কন্ট্রোলার হওয়া উচিত। এক কথায় মাতৃতন্ত্র।
অন্যরা, বিপরীতভাবে, বিশ্বাস করেন যে নিয়ন্ত্রককে অবশ্যই সবকিছু পরিচালনা এবং আদেশ করতে হবে, তাই তিনি শক্ত এবং ভাল খাওয়ানোর জন্য পরিণত হন। এবং তার সাথে একটি পাতলা, সরু মডেল রয়েছে, যার কাজটি দেওয়া এবং আনার জন্য রয়েছে। এটাই পিতৃতন্ত্র।
তাহলে MVC স্কিমে কোনটি ভালো? পিতৃতন্ত্র না মাতৃতন্ত্র?
গণতন্ত্রের ভিত্তিতে একটি পারিবারিক ইউনিট গঠনের দৃষ্টিকোণ থেকে এটিকে দেখি। এবং নেমস্পেস আমাদের এই বিষয়ে সাহায্য করুন।
আমরা মোটা, ক্লাঙ্কি কন্ট্রোলার পছন্দ করি না যেগুলি, একটি চায়না দোকানের ষাঁড়ের মতো, আপনি যদি অসাবধান হন তবে পুরো অ্যাপ্লিকেশনটিকে চূর্ণ করে দিতে পারে।
আমরা মোটা মডেলও পছন্দ করি না। আচ্ছা, কে তাদের পছন্দ করে? তারা মঞ্চের যোগ্য হতে হবে!
চলুন, নেমস্পেসের সাহায্যে, ভালো ম্যাচমেকারের মতো, একটি সুরেলা পরিবার তৈরি করার চেষ্টা করি।
প্রথমে, এর অ্যাপ্লিকেশন ফ্রেমওয়ার্ক তৈরি করা যাক। এটি যতটা সাধারণ, এটি একটি ব্লগ হোক।
আমরা একটি মৌলিক কাঠামো তৈরি করেছি যেখানে:
- ব্লগ আমাদের অ্যাপ্লিকেশন স্টোরেজ;
- ভিউ এবং টেমপ্লেট - ভিউ এবং টেমপ্লেটের স্টোরেজ;
- ইউটিলিটি - শেয়ার্ড লাইব্রেরির ভান্ডার;
- index.php - বুটস্ট্র্যাপ স্ক্রিপ্ট;
- পোস্ট - এখানেই কন্ট্রোলার এবং মডেলের পারিবারিক আইডিল হওয়া উচিত।
index.php এর সাথে সবকিছু সহজ:
রান(); /* * index.php এর শেষ */
আমরা প্রয়োজনীয় পাথ নির্ধারণ করি এবং একটি অটোলোডার তৈরি করি।
অটোলোডার প্রয়োজনীয় ক্লাসগুলি লোড করে, যা ক্লাস নেমস্পেস অনুসারে একটি ফোল্ডার অনুক্রমে অবস্থিত। উদাহরণস্বরূপ, BlogPostServicesView ক্লাসটি ব্লগ/পোস্ট/পরিষেবাগুলিতে অনুসন্ধান করা হবে।
এবং এখানে নেমস্পেসের সাথে প্রথম দেখা হয়।
যখন আমরা index.php শুরু করি, তখন আমরা ব্লগ অ্যাপ্লিকেশনের একটি উদাহরণ তৈরি করি, যার ক্লাসটি Blog/Blog.php থেকে লোড করা হয়।
তার দিকে তাকাই।
পোস্ট = নতুন পোস্ট(); ) পাবলিক ফাংশন রান() ( $this->post->view->all(); ) )// end class Blog
ব্লগ ক্লাস তৈরি করার সময়, আমরা নেমস্পেস ব্লগপোস্ট দিয়ে এটিতে একটি পোস্ট ক্লাস ইনজেক্ট করি এবং অটোলোডার এটি Blog/Post/Post.php থেকে লোড করে।
সম্ভবত এই ক্লাসটিকে কন্ট্রোলার বলা যেতে পারে,
ভিউ = নতুন ভিউ(); ) )//শেষ শ্রেণীর পোস্ট
পোস্ট সত্তা অন্তর্ভুক্ত:
- ডেটা রেকর্ডের গঠন নিজেই - BlogPostEntitiesPostEntity.php
কন্ট্রোলার অনুরোধ পরিবেশনকারী পরিষেবাগুলি - BlogPostServicesView.php (উদাহরণস্বরূপ পরিষেবাগুলির মধ্যে একটি)
db = নতুন DB(); )//end __construct পাবলিক ফাংশন all() ( $posts = $this->db->survey(); Contemplate::compose(array("header" => "header", "main" => "main", "footer" => "পাদলেখ", অ্যারে("posts" => $posts, "title" => "Viper site",)); ) )// end class PostView
ডাটাবেস ইন্টারঅ্যাকশন সিস্টেম - BlogPostRepositoriesDB.php - এটি এখানে, আমাদের পাতলা, মার্জিত মডেল,
শুধু এটা দাও, এটা এনে দাও, আর কিছু না!
dbh = নতুন PDO("mysql:host=localhost;dbname=test", $user, $pass, array(PDO::ATTR_PERSISTENT => সত্য)); ) ধরা (PDOException $e) ( echo "Error!: " . $e->getMessage() ।"
"; ডাই(); ) )//শেষ __কনস্ট্রাকট পাবলিক ফাংশন সার্ভে() ( $query_view = $this->dbh->প্রস্তুত করুন("পোস্ট থেকে *নির্বাচন করুন"); $query_view->Execute(); $query_view- ফেরত দিন >আনয়ন সমস্ত(PDO::FETCH_CLASS, "BlogPostEntitiesPostEntity"); )//শেষ সমীক্ষা )//শেষ ক্লাস Db
ফলস্বরূপ, আমরা একটি অ্যাপ্লিকেশন কাঠামো তৈরি করতে সক্ষম হয়েছি যেখানে সমস্ত উপাদান ভালভাবে সংযুক্ত রয়েছে, যখন আমরা ক্লাসগুলির একটি স্পষ্ট বিচ্ছেদ অর্জন করেছি, যেখানে প্রতিটি শ্রেণী তার নিজস্ব কাজ সম্পাদন করে। আমাদের নিয়ামক পাতলা এবং একই সময়ে শক্তিশালী। মডেল তার সাথে মিলে যায়। নিখুঁত পরিবার!
এবং সমস্ত ধন্যবাদ নেমস্পেসকে।
আমি তর্ক করি না, অনেক ক্ষেত্রে ফ্রেমওয়ার্ক সুবিধাজনক। কিন্তু দেখুন, নেমস্পেস আপনাকে কিছু মনে করিয়ে দেয় না?
ক্লাসে একটি স্পষ্ট বিভাজন, একটি কঠোর এবং একই সাথে ডিরেক্টরি এবং ক্লাসগুলির নমনীয় শ্রেণিবিন্যাস, সম্পূর্ণরূপে বিকাশকারীর অধীনস্থ।
কখনও কখনও একটি ফ্রেমওয়ার্ক আকারে শত শত ফাইল এবং ক্লাস আকারে যেমন কোন উল্লেখযোগ্য অ্যাড-অন নেই।
ক্লাস এবং উপাদানের মিথস্ক্রিয়া জন্য নিয়ম একটি Procrustean বিছানা অনুপস্থিতি.
নিবন্ধটি লারাভেল ফ্রেমওয়ার্কের লেখক টেলর ওটওয়েলের এই বিষয়ে চিন্তাভাবনা দ্বারা অনুপ্রাণিত হয়েছিল, যার জন্য তাকে অনেক ধন্যবাদ।
GitHub-এ উদাহরণ সোর্স কোডের ঠিকানা।
হ্যালো. আজকের নিবন্ধে আমরা দেখব, পিএইচপি নামস্থান কি কি?.
আপনি যদি এটি দীর্ঘদিন ধরে ব্যবহার করে থাকেন ওওপি, তাহলে আপনি সম্ভবত এমন একটি পরিস্থিতির সম্মুখীন হয়েছেন যেখানে, তৃতীয় পক্ষের লাইব্রেরি সংযোগ করার সময়, আপনি একটি ব্যর্থতার সম্মুখীন হয়েছেন কারণ আপনি ইতিমধ্যেই আপনার কোডে লাইব্রেরির মতো একই শ্রেণীর নাম ব্যবহার করছেন। এটি বিশেষ করে ঘটতে পারে যদি আপনি সাধারণ নাম ব্যবহার করেন "মডেল", "ডিবি"এবং তাই আমি এখন আপনাকে বলব কিভাবে এটি ঠিক করা যায়।
নামস্থান- এটি অনন্য শনাক্তকারী (নাম) এর বিমূর্ত গোষ্ঠীকরণের জন্য তৈরি এক ধরণের স্টোরেজ।
সেগুলো. যদি আপনি ব্যবহার করেন নামস্থান, তারপর আপনি নিরাপদে তৃতীয় পক্ষের লাইব্রেরিগুলিকে সংযুক্ত করতে পারেন এবং ভয় পাবেন না যে তাদের আপনার কোডের মতো একই নাম থাকবে৷ আসুন তত্ত্ব দিয়ে শেষ করি এবং অনুশীলনে এগিয়ে যাই।
এর একটি ফাইল তৈরি করা যাক myclass.phpএই বিষয়বস্তুর সাথে
নেমস্পেস আমার\oneপ্রজেক্ট;
ক্লাস মাইক্লাস ( )
?>
এখানে আমরা নামস্থানে একটি ক্লাস তৈরি করেছি আমার\one প্রকল্প. যাইহোক, আপনাকে ঠিক ব্যাকস্ল্যাশ লিখতে হবে। বিভ্রান্ত হবেন না!
এখন ফাইলে index.phpএর নিম্নলিখিত লিখুন
need_one("myclass.php");
$mc = নতুন মাইক্লাস(); // ত্রুটি: ক্লাস পাওয়া যায়নি
$mc = new my\oneProject\MyClass(); // সবকিছু কাজ করছে
?>
আপনি দেখতে পাচ্ছেন, এখন ঠিক সেভাবে একটি ক্লাস তৈরি করা সম্ভব নয়, আপনাকে অবশ্যই নির্দিষ্ট করতে হবে কোনটিতে নামস্থানতিনি শুয়ে আছেন।
আমরা একবারে বেশ কয়েকটি নির্দিষ্ট করতে পারি নামস্থানএকটি ফাইলে
নামস্থান প্রকল্প;
Const CONNECT_OK = 1;
ক্লাস সংযোগ ( )
ফাংশন সংযোগ () ( )
NamespaceAnotherProject;
Const CONNECT_OK = 1;
ক্লাস সংযোগ ( )
ফাংশন সংযোগ () ( )
?>
আমাদের ক্লাস, ফাংশন এবং ধ্রুবকগুলির একেবারে অভিন্ন নাম থাকা সত্ত্বেও, আমাদের নামের দ্বন্দ্ব থাকবে না, কারণ তারা বিভিন্ন জায়গায় শুয়ে আছে।
আমরা বন্ধনী সিনট্যাক্সও ব্যবহার করতে পারি।
নামস্থান প্রকল্প (
Const CONNECT_OK = 1;
ক্লাস সংযোগ ( )
ফাংশন সংযোগ () ( )
}
নেমস্পেস আরেকটি প্রকল্প (
Const CONNECT_OK = 1;
ক্লাস সংযোগ ( )
ফাংশন সংযোগ () ( )
}
?>
আপনি কোড একত্রিত হলে বিশ্বব্যাপী নামস্থানঅন্যান্য স্পেসে কোড সহ, তারপর শুধুমাত্র বন্ধনী সহ সিনট্যাক্স ব্যবহার করা হয়।
নামস্থান প্রকল্প (
Const CONNECT_OK = 1;
ক্লাস সংযোগ ( )
ফাংশন সংযোগ () ( )
}
নেমস্পেস (// গ্লোবাল কোড
session_start();
$a = প্রজেক্ট\কানেক্ট();
ইকো প্রজেক্ট\কানেকশন::স্টার্ট();
}
?>
এছাড়াও, ভুলে যাবেন না যে একটি নামস্থান সংজ্ঞায়িত করা সর্বদা কোডের প্রথম লাইন হওয়া উচিত। এভাবে লিখলে ভুল হবে
আপনি বর্তমানে কোন নামস্থানে আছেন তা খুঁজে বের করতে, আপনি ধ্রুবক ব্যবহার করতে পারেন __NAMESPACE__
নামস্থান প্রকল্প;
প্রতিধ্বনি """, __NAMESPACE__, """; // "প্রকল্প" মুদ্রণ করবে
?>
এই ধ্রুবক ব্যবহার করে আপনি, উদাহরণস্বরূপ, গতিশীলভাবে নাম তৈরি করতে পারেন
নামস্থান প্রকল্প;
ফাংশন সহ($classname) (
$a = __NAMESPACE__ "\\"। $classname;
নতুন $a ফেরত দিন;
}
?>
তাই যে আজকের জন্য সব. কোর্সটি করে আপনি আরও তথ্য এবং ব্যবহারিক জ্ঞান পেতে পারেন
আমি সম্প্রতি একটি নেমস্পেসে আমার প্রকল্পকে এনক্যাপসুলেট করেছি এবং সঠিক ডকুমেন্টেশনের অভাবের সমস্যায় পড়েছি। আমরা যা খুঁজে বের করতে পেরেছি তার সবকিছুই আনুমানিক 2009 সালের, এবং এটি প্রায় 2012... পাওয়া উপাদানে, এমন অনেকগুলি অ-কার্যকর জায়গা রয়েছে যা এমন কিছু ব্যবহার করে যা php-এর বর্তমান সংস্করণে নেই৷ এই প্রসঙ্গে, আমি এই বিষয়ে কিছু আলোকপাত করতে চাই।
সুতরাং, একটি নামস্থান বা নামস্থান কি? মহান উইকিপিডিয়া তাদের এইভাবে সংজ্ঞায়িত করে:
নেমস্পেস হল একটি সেট, যার মানে হল একটি মডেল, বিমূর্ত স্টোরেজ বা পরিবেশ যা অনন্য শনাক্তকারীর (অর্থাৎ নাম) লজিক্যাল গ্রুপিংয়ের জন্য তৈরি করা হয়েছে। একটি নামস্থানে সংজ্ঞায়িত একটি শনাক্তকারী সেই নামস্থানের সাথে যুক্ত। একই শনাক্তকারী স্বাধীনভাবে একাধিক স্থানে সংজ্ঞায়িত করা যেতে পারে। এইভাবে, একটি নামস্থানে সংজ্ঞায়িত একটি শনাক্তকারীর সাথে যুক্ত একটি মান অন্য নামস্থানে সংজ্ঞায়িত একই শনাক্তকারীর মত একই (বা বরং ভিন্ন) অর্থ থাকতে পারে (বা নাও হতে পারে)। নামস্থান-সচেতন ভাষাগুলি এমন নিয়মগুলিকে সংজ্ঞায়িত করে যা নির্দেশ করে যে কোন নামস্থান কোন শনাক্তকারীর অন্তর্গত (অর্থাৎ, এর সংজ্ঞা) উইকি।
সব পরিষ্কার? এটা আসলে সহজ. সংস্করণ 5.3 এর আগে, php-এ শুধুমাত্র দুটি স্পেস ছিল - গ্লোবাল (যেটিতে আপনার প্রধান কোডটি কার্যকর করা হয়েছিল) এবং স্থানীয় (যেটিতে ফাংশন ভেরিয়েবলগুলি সংজ্ঞায়িত করা হয়েছিল)।
সংস্করণ 5.3 থেকে সবকিছু পরিবর্তিত হয়েছে। এখন আপনি আপনার নামস্থান সংজ্ঞায়িত করতে পারেন যেখানে আপনার ক্লাস, পদ্ধতি ইত্যাদি বিদ্যমান থাকবে।
আমি আশা করি এটি একটু পরিষ্কার হয়ে গেছে।
আমি বিশেষভাবে একই ক্লাসের নাম দিয়েছি। যেহেতু তারা বিভিন্ন স্থানে সংজ্ঞায়িত করা হয়েছে, একই নাম থাকা সত্ত্বেও তারা দুটি ভিন্ন শ্রেণী। মূল স্ক্রিপ্ট এখনও গ্লোবাল স্পেসে কাজ করে, এখানে কিছুই পরিবর্তিত হয়নি এবং ক্লাস এবং ফাংশন এখনও এটিতে সংজ্ঞায়িত করা যেতে পারে। তাহলে স্পেস কি তাহলে? প্রথমত, নিশ্চিত করুন যে আপনি যখন কিছু ফ্রেমওয়ার্ক বা লাইব্রেরি সহ একটি ফাইল অন্তর্ভুক্ত করবেন, আপনার ক্লাসগুলি ফ্রেমওয়ার্কের ক্লাসগুলিকে ওভাররাইড করবে না বা এর বিপরীতে।
আপনার নামস্থানে সংজ্ঞায়িত ক্লাসগুলি ব্যবহার করার জন্য, আপনাকে সঠিক জায়গায় গ্লোবাল ওয়ানে আপনার সংজ্ঞায়িত স্থান আমদানি করতে হবে (আমি সাধারণত ফাইলের শুরুতে এটি করতে পছন্দ করি) এটি করার জন্য, use কীওয়ার্ডটি ব্যবহার করুন
মনোযোগ:কিছু কারণে php কীওয়ার্ড ব্যবহারের অনুমতি দেয় না ব্যবহারকন্ডিশন ব্লক এবং লুপ
আসুন ছবিগুলি থেকে উদাহরণ নেওয়া যাক এবং কোডে এটি প্রয়োগ করি:
মনোযোগ:নেমস্পেস কীওয়ার্ডটি অবশ্যই ফাইলের একেবারে শুরুতে অবস্থিত হতে হবে, এর পরপরই php
ফাইল A.php
php namespace A { class A { public static function say() { echo "Я пространство имен А"; } } }
B.php ফাইল
php namespace B { class A { public static function say() { echo "Я пространство имен B"; } } }
একটি বিকল্প সিনট্যাক্স সম্ভব:
php namespace A; class A { public static function say() { echo "Я пространство имен А"; } }
প্রতিটি নামস্থান একটি পৃথক ফাইলে ঘোষণা করার সুপারিশ করা হয়। যদিও এটি একটিতে সম্ভব, এটি কঠোরভাবে সুপারিশ করা হয় না!
এখন তৃতীয় ফাইলে যাওয়া যাক, যেখানে আমাদের প্রধান স্ক্রিপ্ট কাজ করবে
index.php
php
require_once "A.php";
require_once "B.php";
use A\A;
use B\A;
দেখে মনে হবে এটি একটি সুবিধা, শুধুমাত্র আরও কোড যোগ করা হয়েছে, তবে এটি সম্পূর্ণ সত্য নয়, একটু এগিয়ে আমি একটি অটোলোড ক্লাসের একটি উদাহরণ দেব, যার সাথে ক্লাসের সাথে ফাইলগুলিকে সংযুক্ত করার লাইনগুলি অপ্রয়োজনীয় হবে।
এখন আমাদের ক্লাস তাকান.
php
require_once "A.php";
require_once "B.php";
use A\A;
use B\A;
A\A::say();
B\A::say();
মনোযোগ:পিএইচপি নামস্থানে স্কোপ রেজোলিউশন অপারেটর (::) ব্যবহার করে অনুমতি নেই! স্ট্যাটিক ক্লাস পদ্ধতি এবং ধ্রুবক অ্যাক্সেস করার জন্য এটি উপযুক্ত একমাত্র জিনিস। প্রথমে তারা নামস্থানের জন্য এটি ব্যবহার করতে চেয়েছিল, কিন্তু তারপরে উদ্ভূত সমস্যার কারণে তারা এটির বিরুদ্ধে সিদ্ধান্ত নেয়। অতএব, A::A::say(); অবৈধ এবং এর ফলে একটি ত্রুটি হবে।
নামস্থানের জন্য আপনাকে অবশ্যই ব্যাকস্ল্যাশ অক্ষর "\" ব্যবহার করতে হবে
মনোযোগ:ভুল বোঝাবুঝি এড়াতে, স্ট্রিং-এ ব্যবহার করার সময় এই অক্ষরটিকে এড়িয়ে যাওয়া প্রয়োজন: "\\"
নেমস্পেস একে অপরের ভিতরে নেস্ট করা যেতে পারে, আসুন আমাদের A.php ফাইলে যোগ করি:
php
namespace A
{
class A
{
public static function say()
{
echo "Я пространство имен А";
}
}
}
namespace A\subA
{
class A
{
public static function say()
{
echo "Я подпространство имен А";
}
}
}
এবং সূচকে আমরা নিম্নলিখিতগুলি লিখব:
php
require_once "A.php";
require_once "B.php";
use A\A as A;
use B\A as B;
use A\subA as sub
A::say();
A::say();
sub::say();
একটি গুরুত্বপূর্ণ বিষয় হল আমদানি করা স্থানগুলির জন্য উপনাম ব্যবহার করা। আপনি A\subA::say(); আপনি সম্মত হবেন যে প্রতিবার স্পেসগুলিতে সম্পূর্ণ পাথ লেখা কঠিন; এটি এড়ানোর জন্য, উপনামগুলি চালু করা হয়েছিল। কম্পাইল করার সময়, নিম্নলিখিতগুলি ঘটবে: alias sub-এর পরিবর্তে, A\subA প্রতিস্থাপিত হবে, তাই আমরা A\subA::say();
গ্লোবাল স্পেসে সংজ্ঞায়িত ফাংশন কল করার সময় কি হবে? পিএইচপি প্রথমে আপনি যেখানে কাজ করছেন সেই স্থানের মধ্যে একটি ফাংশন সন্ধান করে এবং যদি এটি খুঁজে না পায় তবে এটি বিশ্বব্যাপী পরিসরে চলে যায়। অবিলম্বে নির্দেশ করার জন্য যে আপনি একটি গ্লোবাল ফাংশন ব্যবহার করছেন, আপনাকে অবশ্যই এটির আগে একটি ব্যাকস্ল্যাশ দিতে হবে।
স্পেস থেকে অটোলোডিং ক্লাসের সমস্যা এড়াতে, ফাইল সিস্টেমকে স্পেসগুলির সংগঠনের অনুরূপভাবে সংগঠিত করতে হবে। উদাহরণস্বরূপ, আমাদের একটি রুট ফোল্ডার ক্লাস রয়েছে, যেখানে আমাদের ক্লাসগুলি সংরক্ষণ করা হবে, তারপরে আমাদের স্পেসগুলি নিম্নরূপ সংগঠিত করা যেতে পারে
ক্লাস\A\A.php
classes\A\sub\A.php (সাব সাবস্পেস একটি পৃথক ফাইলে স্থাপন করা হবে)
ক্লাস\B\B.php
PHP এর একটি ম্যাজিক ধ্রুবক __NAMESPACE__ রয়েছে যা বর্তমান স্থানের নাম ধারণ করে।
এবং এখন অটোলোডিং সম্পর্কে।
নীচের ক্লাসটি আমার নয়, আমি এটিকে কাজ করেছি এবং এটিকে কিছুটা উন্নত করেছি, এখান থেকে নেওয়া হয়েছে।মনোযোগ:আপনার ক্লাস লোড করার জন্য, ক্লাসের নাম অবশ্যই ফাইলের নামের সাথে মিলবে!
".$ ফাইল।" in " .$filepath)); if (file_exists($filepath)) ( if(Autoloader::debug) Autoloader::StPutFile(("connected " .$filepath)); $flag = FALSE; require_once($filepath); বিরতি; ) অটোলোডার::রিকারসিভ_অটোলোড($ফাইল, $পাথ2, &$ফ্ল্যাগ); ) ) ক্লোসিডর($হ্যান্ডেল); ) ) প্রাইভেট স্ট্যাটিক ফাংশন StPutFile($data) ( $dir = $_SERVER["DOCUMENT_ROOT"]।" /Log/Log.html"; $file = fopen($dir, "a"); flock($file, LOCK_EX); fwrite($file, ("║" .$data ."=>" .date(" d.m.Y H:i:s")।"
║
" .PHP_EOL)); flock($file, LOCK_UN); fclose ($file); ) ) \spl_autoload_register("yourNameSpace\Autoloader::autoload");)
আপনি যদি লোড করার জন্য আসা ক্লাসগুলির নামগুলি দেখেন তবে আপনি দেখতে পাবেন যে প্রতিটি ক্লাসের আগে ব্যবহারে নির্দিষ্ট নামস্থান থেকে একটি উপসর্গ রয়েছে। এই কারণেই আমি নামস্থানের অনুরূপ ডিরেক্টরিগুলিতে ফাইলগুলির অবস্থান ব্যবহার করার পরামর্শ দিই; এটি এক বা দুটি পুনরাবৃত্তিতে অনুসন্ধানের গতি বাড়ায়।
এখন আমাদের সূচক এভাবে লেখা যেতে পারে:
php
require_once "Autoloader.php";
use Autoloader as Autoloader;
use A\A as A;
use B\A as B;
use A\subA as sub
A::say();
A::say();
sub::say();
এখন আপনি যে সমস্ত ক্লাস এবং ইন্টারফেস ব্যবহার করবেন তা স্বয়ংক্রিয়ভাবে লোড হবে।
স্পেস সহ ভাষার কিছু গতিশীল ক্ষমতা প্রদর্শন করতে, আসুন অন্য একটি শ্রেণী ঘোষণা করি:
test.php
php
namespace mySpace
{
class test
{
__construct()
{
//конструктор;
}
function sayName($name)
{
echo "Привет " . $name;
}
static function sayOther()
{
echo "статичный вызов";
}
}
}
Index.php
php
require_once "Autoloader.php";
use Autoloader as Autoloader;
use mySpace\test as test
//можно, например сделать так
$class = "test";
//приведет к вызову конструктора
$obj = new $class;
$obj->sayName("পরীক্ষা"); //অথবা আপনি এই পরীক্ষাটি করতে পারেন\sayName("test2"); //অথবা এই $obj::sayName("test"); //অথবা আপনি এই পরীক্ষাটি করতে পারেন::sayName("test2");
আমি আশা করি যে আমার নিবন্ধটি কারও কাজে লাগবে।
(PHP 5 >= 5.3.0, PHP 7)
নেমস্পেসের ব্যবহার নিয়ে আলোচনা করার আগে, পিএইচপি কীভাবে জানে যে আপনার কোডটি কোন নামস্থানের উপাদানটি অনুরোধ করছে তা বোঝা গুরুত্বপূর্ণ। পিএইচপি নেমস্পেস এবং একটি ফাইল সিস্টেমের মধ্যে একটি সাধারণ সাদৃশ্য তৈরি করা যেতে পারে। একটি ফাইল সিস্টেমে একটি ফাইল অ্যাক্সেস করার তিনটি উপায় আছে:
- আপেক্ষিক ফাইলের নাম যেমন foo.txt. এই সমাধান currentdirectory/foo.txtযেখানে বর্তমান ডিরেক্টরী হল বর্তমানে দখল করা ডিরেক্টরি। তাই যদি বর্তমান ডিরেক্টরি হয় /home/foo, নাম সমাধান করে /home/foo/foo.txt.
- আপেক্ষিক পথ নামের মত subdirectory/foo.txt. এই সমাধান currentdirectory/subdirectory/foo.txt.
- পরম পথ নাম মত /main/foo.txt. এই সমাধান /main/foo.txt.
- অযোগ্য নাম, বা একটি অপ্রত্যাশিত শ্রেণীর নাম যেমন $a = new foo();বা foo::staticmethod(); বর্তমান নামস্থান, এই সমাধান বর্তমান নামস্থান\foo foo. একটি সতর্কতা: ফাংশন এবং ধ্রুবকগুলির জন্য অযোগ্য নামগুলি বৈশ্বিক ফাংশন এবং ধ্রুবকগুলির সমাধান করবে যদি নেমস্পেস ফাংশন বা ধ্রুবক সংজ্ঞায়িত না হয়। বিস্তারিত জানার জন্য নেমস্পেস ব্যবহার করা দেখুন: গ্লোবাল ফাংশন/ধ্রুবক-এ ফলব্যাক।
- যোগ্য নাম, বা একটি প্রিফিক্সড ক্লাস নাম যেমন $a = নতুন সাবনেমস্পেস\foo();বা subnamespace\foo::staticmethod();. যদি বর্তমান নামস্থান হয় বর্তমান নামস্থান, এই সমাধান বর্তমান নামস্থান\সাবনামস্পেস\foo. যদি কোডটি বিশ্বব্যাপী হয়, অ-নেমস্পেস কোড, এটি সমাধান করে সাবনেমস্পেস\foo.
- সম্পূর্ণরূপে যোগ্য নাম, অথবা বিশ্বব্যাপী উপসর্গ অপারেটর সহ একটি উপসর্গযুক্ত নাম $a = নতুন \currentnamespace\foo();বা \currentnamespace\foo::staticmethod();. এটি সর্বদা কোডে উল্লিখিত আক্ষরিক নামের সমাধান করে, বর্তমান নামস্থান\foo.
এখানে প্রকৃত কোডে তিন ধরণের সিনট্যাক্সের একটি উদাহরণ রয়েছে:
নামস্থান Foo\Bar\subnamespace;
const FOO = 1 ;
ফাংশন foo()()
ক্লাস foo
{
}
?>
নামস্থান Foo\Bar;
"file1.php" অন্তর্ভুক্ত করুন;
const FOO = 2;
ফাংশন foo()()
ক্লাস foo
{
স্ট্যাটিক ফাংশন স্ট্যাটিক পদ্ধতি()()
}
/* অযোগ্য নাম */
foo(); foo::staticmethod(); ইকো FOO;
/* যোগ্য নাম */
সাবনামস্পেস\foo(); // Foo\Bar\subnamespace\foo ফাংশনের সমাধান করে
subnamespace\foo::staticmethod(); // Foo\Bar\subnamespace\foo ক্লাসে সমাধান করে,
// পদ্ধতি স্ট্যাটিক পদ্ধতি
echo subnamespace\FOO; // ধ্রুবক Foo\Bar\subnamespace\FOO-তে সমাধান করে
/* সম্পূর্ণ যোগ্য নাম */
\foo\bar\foo(); // Foo\Bar\foo ফাংশনের সমাধান করে
\foo\Bar\foo::staticmethod(); // Foo\Bar\foo, মেথড স্ট্যাটিকমেথড ক্লাসে সমাধান করে
echo\Foo\Bar\FOO; // ধ্রুবক Foo\Bar\FOO এর সমাধান করে
?>
উল্লেখ্য যে কোনো গ্লোবাল ক্লাস, ফাংশন বা ধ্রুবক অ্যাক্সেস করতে, একটি সম্পূর্ণ যোগ্য নাম ব্যবহার করা যেতে পারে, যেমন \strlen()বা ব্যতিক্রমবা \INI_ALL. ?>