"পরিবর্তনশীল সুযোগ" কী?
ভেরিয়েবলের সীমিত "সুযোগ" বা "যে জায়গাগুলি থেকে তারা অ্যাক্সেসযোগ্য" রয়েছে have শুধু কারণ আপনি লিখেছেন $foo = 'bar';
একবার কোথাও আপনার অ্যাপ্লিকেশনের মধ্যে তার মানে এই নয় আপনি পাঠাতে পারেন $foo
থেকে সর্বত্র আবেদন ভিতরে অন্য। ভেরিয়েবলের $foo
একটি নির্দিষ্ট সুযোগ রয়েছে যার মধ্যে এটি বৈধ এবং একই স্কোপটিতে কেবল কোডটি ভেরিয়েবলটিতে অ্যাক্সেস পায়।
পিএইচপি-তে কীভাবে একটি স্কোপ সংজ্ঞায়িত করা হয়?
খুব সহজ: পিএইচপি এর কার্যকারিতা রয়েছে । এটিই একমাত্র ধরণের স্কোপ বিভাজক যা পিএইচপি-তে বিদ্যমান। কোনও ফাংশনের অভ্যন্তরে চলকগুলি কেবল সেই ফাংশনের অভ্যন্তরে উপলব্ধ। ফাংশনের বাইরে চলকগুলি ফাংশনের বাইরে যে কোনও জায়গায় পাওয়া যায়, তবে কোনও ফাংশনের অভ্যন্তরে নয়। এর অর্থ পিএইচপি-তে একটি বিশেষ সুযোগ রয়েছে: বৈশ্বিক সুযোগ। যে কোনও ক্রিয়াকলাপের বাইরে ঘোষিত যেকোন পরিবর্তনশীল এই বৈশ্বিক সুযোগের মধ্যে।
উদাহরণ:
<?php
$foo = 'bar';
function myFunc() {
$baz = 42;
}
$foo
হয় বিশ্বব্যাপী , সুযোগ $baz
একটি হল স্থানীয় সুযোগ ভিতরে myFunc
। কেবলমাত্র অভ্যন্তরের myFunc
কোডটিতে অ্যাক্সেস রয়েছে $baz
। কেবলমাত্র বাইরের myFunc
কোডটিতে অ্যাক্সেস রয়েছে $foo
। অন্যের অ্যাক্সেস নেই:
<?php
$foo = 'bar';
function myFunc() {
$baz = 42;
echo $foo; // doesn't work
echo $baz; // works
}
echo $foo; // works
echo $baz; // doesn't work
স্কোপ এবং অন্তর্ভুক্ত ফাইল
ফাইলের সীমানা স্কোপকে আলাদা করে না :
a.php
<?php
$foo = 'bar';
b.php
<?php
include 'a.php';
echo $foo; // works!
অন্যান্য নিয়মের ক্ষেত্রে প্রযোজ্য একই কোডগুলি include
ডি কোডের ক্ষেত্রে প্রযোজ্য: কেবলমাত্র function
পৃথক পৃথক সুযোগ। সুযোগের উদ্দেশ্যে, আপনি অনুলিপি এবং পেস্টিং কোডের মতো ফাইলগুলি অন্তর্ভুক্ত করার বিষয়ে ভাবতে পারেন:
c.php
<?php
function myFunc() {
include 'a.php';
echo $foo; // works
}
myFunc();
echo $foo; // doesn't work!
উপরের উদাহরণে, a.php
ভিতরে অন্তর্ভুক্ত করা হয়েছিল myFunc
, অভ্যন্তরের কোনও ভেরিয়েবলের a.php
কেবল স্থানীয় ফাংশন সুযোগ রয়েছে scope শুধু কারণ তারা প্রদর্শিত বিশ্বব্যাপী সুযোগ হতে হবে a.php
অগত্যা মানে এই নয় তারা, এটা আসলে যা প্রেক্ষাপটে যে কোড অন্তর্ভুক্ত করা হয় / মৃত্যুদন্ড কার্যকর উপর নির্ভর করে।
ফাংশন এবং ক্লাসের ভিতরে ফাংশনগুলি সম্পর্কে কী?
প্রতিটি নতুন function
ঘোষণা একটি নতুন সুযোগ প্রবর্তন করে, এটি এত সহজ।
(বেনামে) ফাংশন ভিতরে ফাংশন
function foo() {
$foo = 'bar';
$bar = function () {
// no access to $foo
$baz = 'baz';
};
// no access to $baz
}
ক্লাস
$foo = 'foo';
class Bar {
public function baz() {
// no access to $foo
$baz = 'baz';
}
}
// no access to $baz
সুযোগ কী ভাল?
স্কোপিংয়ের সমস্যাগুলি মোকাবেলা করা বিরক্তিকর মনে হতে পারে তবে জটিল অ্যাপ্লিকেশনগুলি লেখার জন্য সীমিত পরিবর্তনশীল সুযোগটি প্রয়োজনীয়! আপনার ঘোষিত প্রতিটি পরিবর্তনশীল যদি আপনার অ্যাপ্লিকেশনের ভিতরে অন্য যে কোনও জায়গা থেকে পাওয়া যায় তবে কী পরিবর্তন হয় তা ট্র্যাক করার কোনও সত্যিকারের উপায় ছাড়া আপনি আপনার সমস্ত ভেরিয়েবলের দিকে পদক্ষেপ নিচ্ছেন। আপনার ভেরিয়েবলগুলিতে কেবলমাত্র সংবেদনশীল নাম দেওয়া যেতে পারে, আপনি সম্ভবত ভেরিয়েবল $name
একাধিক জায়গায় ব্যবহার করতে চান use আপনার অ্যাপ্লিকেশনটিতে একবারে যদি এই অনন্য পরিবর্তনশীল নামটি থাকতে পারে তবে আপনার ভেরিয়েবলগুলি অনন্য এবং আপনি ভুল ভেরিয়েবলটি কোডের ভুল অংশ থেকে পরিবর্তন করছেন না তা নিশ্চিত করতে আপনাকে জটিল জটিল নামকরণের প্রকল্পগুলি অবলম্বন করতে হবে।
পালন:
function foo() {
echo $bar;
}
সুযোগ না থাকলে উপরের কাজটি কী করবে? কোথা $bar
থেকে আসে? এটা কি রাষ্ট্র আছে? এটি কি আরম্ভ করা হয়? আপনার কি প্রতিবার চেক করতে হবে? এটি রক্ষণাবেক্ষণযোগ্য নয়। যা আমাদের কাছে নিয়ে আসে ...
স্কোপ সীমানা অতিক্রম করে
সঠিক উপায়: বাইরে এবং বাইরে ভেরিয়েবল পাস করা passing
function foo($bar) {
echo $bar;
return 42;
}
ভেরিয়েবল $bar
স্পষ্টত এই সুযোগে ফাংশন আর্গুমেন্ট হিসাবে উপস্থিত হয়। কেবল এই ফাংশনটি দেখলে এটি স্পষ্ট যেখানে এটির সাথে যে মানগুলি কাজ করে সেখান থেকে উদ্ভূত। এটি তখন স্পষ্টভাবে একটি মান ফেরত দেয় । কলকারীটির কী কী ভেরিয়েবলগুলি কাজ করবে এবং তার ফেরতের মানগুলি কোথা থেকে আসবে তা জানার আত্মবিশ্বাস রয়েছে:
$baz = 'baz';
$blarg = foo($baz);
অজ্ঞাতনামা ফাংশনে ভেরিয়েবলের পরিধি বাড়ানো
$foo = 'bar';
$baz = function () use ($foo) {
echo $foo;
};
$baz();
বেনামে ফাংশন স্পষ্টভাবে $foo
এর চারপাশের সুযোগ থেকে অন্তর্ভুক্ত । নোট করুন যে এটি বিশ্বব্যাপী সুযোগ হিসাবে একই নয় ।
ভুল পথ: global
আগেই বলা হয়েছে, বৈশ্বিক সুযোগটি কিছুটা বিশেষ এবং ফাংশনগুলি এ থেকে স্পষ্টতই চলকগুলি আমদানি করতে পারে:
$foo = 'bar';
function baz() {
global $foo;
echo $foo;
$foo = 'baz';
}
এই ফাংশনটি বৈশ্বিক চলকটি ব্যবহার করে এবং সংশোধন করে $foo
। এটা করো না! (যদি না আপনি সত্যিই সত্যই জানেন যে আপনি কী করছেন, এবং তারপরেও: করবেন না!)
এই ফাংশনটির সমস্ত কলকারী দেখেন এটি হ'ল:
baz(); // outputs "bar"
unset($foo);
baz(); // no output, WTF?!
baz(); // outputs "baz", WTF?!?!!
এই ফাংশনটির কোনও পার্শ্ব প্রতিক্রিয়া রয়েছে এমন কোনও ইঙ্গিত নেই , তবুও তা করে। এটি খুব সহজেই জট বেঁধে ওঠে কারণ কিছু ক্রিয়াকলাপগুলি কিছু বিশ্বব্যাপী রাষ্ট্রের সংশোধন করে এবং প্রয়োজনীয় রাখে । আপনি ফাংশনগুলি স্টেটলেস হতে চান , কেবল তাদের ইনপুটগুলিতে অভিনয় করে এবং সংজ্ঞায়িত আউটপুট ফিরিয়ে দেয়, তবে আপনি বহুবার কল করে।
আপনার যতটা সম্ভব বৈশ্বিক সুযোগ ব্যবহার করা এড়ানো উচিত; অবশ্যই আপনার বৈশ্বিক সুযোগগুলি থেকে স্থানীয় স্কোপে "টানা" ভেরিয়েবল হওয়া উচিত নয়।