সার্বজনীন:
আপনি যখন কোনও পদ্ধতি (ফাংশন) বা কোনও সম্পত্তি (পরিবর্তনশীল) হিসাবে ঘোষণা করেন তখন public
সেই পদ্ধতিগুলি এবং বৈশিষ্ট্যগুলি দ্বারা প্রবেশ করা যেতে পারে:
- এটি একই ক্লাস ঘোষণা করেছে।
- উপরোক্ত ঘোষিত শ্রেণীর উত্তরাধিকারী ক্লাসগুলি।
- এই শ্রেণীর বাইরের যে কোনও বিদেশী উপাদানও সেই জিনিসগুলি অ্যাক্সেস করতে পারে।
উদাহরণ:
<?php
class GrandPa
{
public $name='Mark Henry'; // A public variable
}
class Daddy extends GrandPa // Inherited class
{
function displayGrandPaName()
{
return $this->name; // The public variable will be available to the inherited class
}
}
// Inherited class Daddy wants to know Grandpas Name
$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'
// Public variables can also be accessed outside of the class!
$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Prints 'Mark Henry'
সুরক্ষিত:
আপনি যখন কোনও পদ্ধতি (ফাংশন) বা কোনও সম্পত্তি (পরিবর্তনশীল) হিসাবে ঘোষণা করেন protected
, সেই পদ্ধতিগুলি এবং বৈশিষ্ট্যগুলি দ্বারা অ্যাক্সেস করা যায়
- এটি একই ক্লাস ঘোষণা করেছে।
- উপরোক্ত ঘোষিত শ্রেণীর উত্তরাধিকারী ক্লাসগুলি।
বহিরাগত সদস্যরা সেই পরিবর্তনগুলি অ্যাক্সেস করতে পারবেন না। "বহিরাগত" এই অর্থে যে তারা ঘোষিত বর্গের নিজস্ব উদাহরণ নয়।
উদাহরণ:
<?php
class GrandPa
{
protected $name = 'Mark Henry';
}
class Daddy extends GrandPa
{
function displayGrandPaName()
{
return $this->name;
}
}
$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'
$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error
সঠিক ত্রুটিটি হ'ল:
পিএইচপি মারাত্মক ত্রুটি: সুরক্ষিত সম্পত্তি গ্র্যান্ডপা :: access নাম অ্যাক্সেস করতে পারে না
ব্যক্তিগত:
আপনি যখন কোনও পদ্ধতি (ফাংশন) বা কোনও সম্পত্তি (পরিবর্তনশীল) হিসাবে ঘোষণা করেন তখন private
সেই পদ্ধতিগুলি এবং বৈশিষ্ট্যগুলি দ্বারা প্রবেশ করা যেতে পারে:
- এটি একই ক্লাস ঘোষণা করেছে।
বহিরাগত সদস্যরা সেই পরিবর্তনগুলি অ্যাক্সেস করতে পারবেন না। বহিরাগতরা এই অর্থে যে তারা ঘোষিত শ্রেণীর নিজেরাই এমনকি ঘোষিত শ্রেণীর উত্তরাধিকারী ক্লাসগুলিরও আপত্তি করে না ।
উদাহরণ:
<?php
class GrandPa
{
private $name = 'Mark Henry';
}
class Daddy extends GrandPa
{
function displayGrandPaName()
{
return $this->name;
}
}
$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Results in a Notice
$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error
সঠিক ত্রুটি বার্তাগুলি হ'ল:
বিজ্ঞপ্তি: অপরিজ্ঞাত সম্পত্তি: বাবা: $ নাম
মারাত্মক ত্রুটি: ব্যক্তিগত সম্পত্তি গ্র্যান্ডপা: access অ্যাক্সেস করা যায় না
প্রতিবিম্ব ব্যবহার করে দাদা ক্লাস বিচ্ছিন্ন করা
এই বিষয়টি সত্যই সুযোগের বাইরে নয় এবং প্রতিবিম্বটি সত্যই শক্তিশালী তা প্রমাণ করার জন্য আমি এখানে এটি যুক্ত করছি। আমি উপরোক্ত তিনটি উদাহরণে যেমন বলেছি, protected
এবং private
সদস্য (সম্পত্তি এবং পদ্ধতি) শ্রেণীর বাইরে প্রবেশ করা যায় না।
যাইহোক, প্রতিফলন সঙ্গে আপনি কি করতে পারেন অতিরিক্ত সাধারণ এমনকি অ্যাক্সেস করার মাধ্যমে protected
এবংprivate
ক্লাসের বাইরের সদস্যদের !
আচ্ছা, প্রতিবিম্ব কি?
প্রতিচ্ছবি বিপরীত ইঞ্জিনিয়ার ক্লাস, ইন্টারফেস, ফাংশন, পদ্ধতি এবং এক্সটেনশান ক্ষমতা যুক্ত করে। অতিরিক্তভাবে, তারা ফাংশন, শ্রেণি এবং পদ্ধতিগুলির জন্য ডক মন্তব্যগুলি পুনরুদ্ধার করার উপায় সরবরাহ করে।
প্রস্তাবনা
আমাদের একটি ক্লাস নাম রয়েছে Grandpas
এবং বলি আমাদের তিনটি সম্পত্তি রয়েছে। সহজে বোঝার জন্য, নাম সহ তিনটি দাদা রয়েছে তা বিবেচনা করুন:
- মার্ক হেনরি
- জন সংঘর্ষ
- উইল জোন্স
তাদের (বরাদ্দ সংশোধনকারীদের) করা যাক public
, protected
এবং private
যথাক্রমে। আপনি খুব ভাল জানেন যে protected
এবং private
সদস্যদের ক্লাসের বাইরে অ্যাক্সেস করা যায় না। এখন প্রতিবিম্বটি ব্যবহার করে বিবৃতিটির বিরোধিতা করি।
কোড
<?php
class GrandPas // The Grandfather's class
{
public $name1 = 'Mark Henry'; // This grandpa is mapped to a public modifier
protected $name2 = 'John Clash'; // This grandpa is mapped to a protected modifier
private $name3 = 'Will Jones'; // This grandpa is mapped to a private modifier
}
# Scenario 1: without reflection
$granpaWithoutReflection = new GrandPas;
# Normal looping to print all the members of this class
echo "#Scenario 1: Without reflection<br>";
echo "Printing members the usual way.. (without reflection)<br>";
foreach($granpaWithoutReflection as $k=>$v)
{
echo "The name of grandpa is $v and he resides in the variable $k<br>";
}
echo "<br>";
#Scenario 2: Using reflection
$granpa = new ReflectionClass('GrandPas'); // Pass the Grandpas class as the input for the Reflection class
$granpaNames=$granpa->getDefaultProperties(); // Gets all the properties of the Grandpas class (Even though it is a protected or private)
echo "#Scenario 2: With reflection<br>";
echo "Printing members the 'reflect' way..<br>";
foreach($granpaNames as $k=>$v)
{
echo "The name of grandpa is $v and he resides in the variable $k<br>";
}
আউটপুট:
#Scenario 1: Without reflection
Printing members the usual way.. (Without reflection)
The name of grandpa is Mark Henry and he resides in the variable name1
#Scenario 2: With reflection
Printing members the 'reflect' way..
The name of grandpa is Mark Henry and he resides in the variable name1
The name of grandpa is John Clash and he resides in the variable name2
The name of grandpa is Will Jones and he resides in the variable name3
সাধারণ ভুল ধারণা:
নীচের উদাহরণ দিয়ে বিভ্রান্ত করবেন না দয়া করে। আপনি এখনও দেখতে পাচ্ছেন, প্রতিচ্ছবি ব্যবহার না করে private
এবং protected
সদস্যদের শ্রেণির বাইরে অ্যাক্সেস করা যাবে না
<?php
class GrandPas // The Grandfather's class
{
public $name1 = 'Mark Henry'; // This grandpa is mapped to a public modifier
protected $name2 = 'John Clash'; // This grandpa is mapped to a protected modifier
private $name3 = 'Will Jones'; // This grandpa is mapped to a private modifier
}
$granpaWithoutReflections = new GrandPas;
print_r($granpaWithoutReflections);
আউটপুট:
GrandPas Object
(
[name1] => Mark Henry
[name2:protected] => John Clash
[name3:GrandPas:private] => Will Jones
)
ডিবাগিং ফাংশন
print_r
, var_export
এবং var_dump
হয় ডিবাগার ফাংশন । তারা মানব-পঠনযোগ্য আকারে একটি পরিবর্তনশীল সম্পর্কে তথ্য উপস্থাপন করে। এই তিনটি কার্যকারিতা প্রকাশ করবে protected
এবং private
পিএইচপি 5. স্ট্যাটিক বর্গ সদস্যদের সঙ্গে বস্তুর বৈশিষ্ট্য হবে না প্রদর্শন করা।
আরও সংস্থানসমূহ: