সরকারী, ব্যক্তিগত এবং সুরক্ষিত মধ্যে পার্থক্য কি?


988

এবং আমি কেন ব্যবহার করা উচিত যখন public, privateএবং protectedকার্যকারিতা ও একটি ক্লাসের ভিতরে ভেরিয়েবল? তাদের মধ্যে পার্থক্য কী?

উদাহরণ:

// Public
public $variable;
public function doSomething() {
  // ...
}

// Private
private $variable;
private function doSomething() {
  // ...
}

// Protected
protected $variable;
protected function doSomething() {
  // ...
}

59
আমি মনে করি প্রতিটি কীওয়ার্ড কী করে তার আক্ষরিক সংজ্ঞা প্রদানের পরিবর্তে এই প্রশ্নের প্রতিটি ব্যবহারের ব্যবহারিক উদাহরণ সহ উত্তরগুলি থেকে উপকৃত হবে।
ম্যাথু

70
আমি সত্যই মনে করি যে এই প্রশ্নটি জনসাধারণের উচিত, সুরক্ষিত নয়।
dotancohen

উত্তর:


1260

তুমি ব্যাবহার কর:

  • public যে সম্পত্তি / পদ্ধতিটি যে কোনও জায়গা থেকে পাওয়া যায়, অন্য শ্রেণি এবং অবজেক্টের উদাহরণগুলি।

  • private সুযোগ যখন আপনি চান নিজের সম্পত্তি / পদ্ধতিটি কেবল তার নিজস্ব শ্রেণিতে দৃশ্যমান হোক।

  • protected সুযোগ যখন আপনি প্যারেন্ট ক্লাস সহ বর্তমান শ্রেণীর প্রসারিত সমস্ত শ্রেণিতে আপনার সম্পত্তি / পদ্ধতিটি দৃশ্যমান করতে চান।

আরও: (বিস্তৃত তথ্যের জন্য)


79
protectedসুযোগ যখন আপনি বর্তমান বর্গ এবং এর প্যারেন্ট ক্লাসগুলি প্রসারিত সমস্ত শ্রেণিতে আপনার পরিবর্তনশীল / ফাংশনটি দৃশ্যমান করতে চান ।
শহীদ

4
@ সাহিদ - আপনার বক্তব্য আমি বুঝতে পারছি না ক্লাস এ-তে প্রসারিত যে কোনও শ্রেণিও এ এর ​​পিতামাতার বর্গকে প্রসারিত করে, না?
জেডিলেজ

4
@ জেডিলেজ - দয়া করে লিঙ্কটি দেখুনhttp://www.php.net/manual/en/language.oop5.visibility.php#109324
শহীদ

4
@ গ্রোলার কেন তখন সব কিছু ব্যবহার করে বিরক্ত করবেন?
জে.স্টেভে

27
@ গ্রোলার, আরও সহায়ক উত্তরটি হ'ল সম্ভব যে কোনও বস্তুর অভ্যন্তরীণ কাজ যতটা সম্ভব লুকানো ভাল। এভাবে ভাঙ্গার সম্ভাবনা কম less আপনি যদি সর্বজনীন করে থাকেন তবে অন্য প্রোগ্রামার একটি ভেরিয়েবল পরিবর্তন করতে পারে যা আপনি আপনার অবজেক্টের অভ্যন্তরীণ কাজ ছাড়া অন্য কোনও জিনিস দ্বারা পরিবর্তন করতে চান না।
সাইপ্রাস

1174

DD

সার্বজনীন:

আপনি যখন কোনও পদ্ধতি (ফাংশন) বা কোনও সম্পত্তি (পরিবর্তনশীল) হিসাবে ঘোষণা করেন তখন 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. স্ট্যাটিক বর্গ সদস্যদের সঙ্গে বস্তুর বৈশিষ্ট্য হবে না প্রদর্শন করা।


আরও সংস্থানসমূহ:



দেরিতে ক্ষমাপ্রার্থী এই কনভোতে যোগ করুন। কেউ আমাকে এগুলি কেন ব্যবহার করতে পারবেন বলতে পারেন? তারা কীভাবে ইত্যাদি কাজ করে তা আপনি পুরোপুরি ব্যাখ্যা করেছেন I আমি কেবল এইগুলির জন্য ব্যবহারের সুবিধা জানতে চাই। ধন্যবাদ
জেমসজি

উপরের অন্যান্য মন্তব্যে @ জেমস জি এটির কিছুটা ব্যাখ্যা করেছেন। stackoverflow.com/questions/4361553/...
cjmling

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

1
আমি আপনাকে ধৈর্য্য লেখেরার দ্বারা প্রদত্ত বিমূর্ততা সম্পর্কে ব্যাখ্যাটি এখানে পড়ার পরামর্শ দিচ্ছি: স্ট্যাকওভারফ্লো / প্রশ্ন / 2558559/… । এটি শঙ্কর দামোদরনের ব্যাখ্যাগুলিতে একটি নিখুঁত সংযোজন।
জুলিও মার্চি

83

এটি ডেটা এনক্যাপসুলেশন এবং ভাল ইন্টারফেস ডিজাইনের প্রচার করে কারণ এটি সর্বনিম্ন দৃশ্যমানতার জন্য প্রয়োজনীয় ডিফল্ট হিসাবে ভাল অনুশীলন হিসাবে বিবেচিত হয়। সদস্যের পরিবর্তনশীল এবং পদ্ধতিটির দৃশ্যমানতার কথা বিবেচনা করার সময় সদস্য অন্যান্য বস্তুর সাথে মিথস্ক্রিয়াতে ভূমিকা রাখার বিষয়ে চিন্তা করুন think

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

সাদৃশ্য হিসাবে একটি গাড়ী ব্যবহার করতে, গতি, গিয়ার এবং দিকনির্দেশের মতো জিনিসগুলি ব্যক্তিগত উদাহরণের ভেরিয়েবল হবে। আপনি চান না যে ড্রাইভার সরাসরি বায়ু / জ্বালানির অনুপাতের মতো জিনিসগুলি চালিত করে। পরিবর্তে, আপনি পাবলিক পদ্ধতি হিসাবে সীমিত সংখ্যক ক্রিয়া প্রকাশ করেন ose একটি গাড়িতে ইন্টারফেস যেমন পদ্ধতি অন্তর্ভুক্ত হতে পারে accelerate(), deccelerate()/ brake(), setGear(), turnLeft(),turnRight() , ইত্যাদি

গাড়িটির ইন্টার্নালরা কীভাবে এই ক্রিয়াগুলি বাস্তবায়িত করে এবং চালক এবং রাস্তায় থাকা অন্যদের জন্য কার্যকারিতাটি প্রকাশ করা বিপজ্জনক হতে পারে তা চালক জানেন না বা তার যত্ন নেওয়া উচিত নয়। সুতরাং একটি সার্বজনীন ইন্টারফেস ডিজাইন করার ভাল অনুশীলন এবং সেই ইন্টারফেসের পিছনে ডেটা encapsulate।

এই পদ্ধতির সাহায্যে ক্লায়েন্ট কোডের সাথে ইন্টারফেসের চুক্তি ভঙ্গ না করে আপনার ক্লাসে সর্বজনীন পদ্ধতিগুলির প্রয়োগ পরিবর্তন এবং উন্নত করতে দেয়। উদাহরণস্বরূপ, আপনি উন্নত করতে পারেaccelerate() আরও জ্বালানী দক্ষ পদ্ধতিটি , তবুও সেই পদ্ধতির ব্যবহার একই থাকবে; ক্লায়েন্ট কোডে কোনও পরিবর্তন প্রয়োজন হবে না তবুও আপনার দক্ষতা উন্নতির সুবিধাগুলি কাটাতে হবে।

সম্পাদনা: যেহেতু এটা মনে হয় আপনি অবজেক্ট ওরিয়েন্টেড ধারণা (যা অনেক বেশি কোনো ভাষা এর সিনট্যাক্স তুলনায় মাস্টার করা কঠিন) শেখার তন্মধ্যে এখনও, আমি অত্যন্ত একটি কপি গোছগাছ সুপারিশ , অ্যান্ড প্র্যাকটিস পিএইচপি অবজেক্টস প্যাটার্নস ম্যাট Zandstra দ্বারা। এই বইটি আমাকে প্রথমে আমাকে সিনট্যাক্স শেখানোর পরিবর্তে কীভাবে ওওপি কার্যকরভাবে ব্যবহার করতে হয় তা শিখিয়েছিল । আমি বাক্যবিন্যাস কয়েক বছর আগেই শিখেছি, তবে ওওপি-র "কেন" না বুঝে এটি অযথা।


3
এই পোস্টটির সম্পাদনায় প্রস্তাবিত বইটি সত্যিই খুব দুর্দান্ত। আমি এখনও অবধি বেশ আলোকিত প্রমাণ করেছি proved প্রথম কয়েকটি অধ্যায় আমার ক্লাস-সম্পর্কিত বেশিরভাগ প্রশ্নের উত্তর দিয়েছিল।
জোশিয়ার

যে বইগুলি আমাকে সত্যই অবজেক্টগুলি বোঝার অনুমতি দিয়েছিল, অযৌক্তিক বিবরণ দিয়ে আমার চিন্তাভাবনা না করেই, যেমন স্মলটালকের উদাহরণ, ডেভিড এ টেলরের ছিল, বাড়িয়ে যেমন স্মলটালকের উদাহরণগুলি অবজেক্ট ওরিয়েন্টেড টেকনোলজি: অবজেক্ট টেকনোলজির সাথে ম্যানেজারের গাইড এবং বিজনেস ইঞ্জিনিয়ারিং । উভয়ই কেবলমাত্র 100 পৃষ্ঠাগুলি, এবং প্রতিটি বিকেলে পড়ার জন্য যথেষ্ট সহজ। অবশ্যই গামা এটেলের ডিজাইনের প্যাটার্ন রয়েছে , যদিও 'আপনি যা পরিবর্তন করতে চান তা সাবক্লাস' দ্বারা প্রাথমিক পদ্ধতির বর্ণনা করা যেতে পারে।
পতঞ্জলি

খুব সুন্দর উপমা। আপনার কাছে কি সুরক্ষিত বনাম ব্যক্তিগত জন্য কিছু আছে?
জোনিস এলমারিস

79

private - শুধুমাত্র ক্লাসের সাথেই প্রবেশ করা যায়

protected - ক্লাস এবং ইনহরতিং ক্লাস ছাড়া প্রবেশ করা যায়

public - ক্লাসের বাইরেও কোড থেকে অ্যাক্সেস করা যায়

এটি ভেরিয়েবলের পাশাপাশি ফাংশনেও প্রযোজ্য।


সুরক্ষিত সংজ্ঞাটি এখানে সঠিক কিনা তা নিশ্চিত না, প্রকৃত নির্বাচিত উত্তর থেকে মনে হয়, সুরক্ষিত - কেবল উত্তরাধিকার সূত্রে প্রাপ্ত শ্রেণি থেকে শুরু করা যেতে পারে, মূল / পিতামাতার শ্রেণি থেকে নয়। "ক্লাস ব্যতীত" বলা কিছুটা বিভ্রান্ত হতে পারে।
pal4 Life

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

কোন শ্রেণি কি অন্য শ্রেণীর পাবলিক অ্যাক্সেস করতে পারে?
সার্জাস

1
@ সেরজাস: না, কেবলমাত্র অন্য একটি বস্তুর, যদি না তারা স্থির পদ্ধতি / ক্ষেত্র হয়।
ড্যানমন

আমি জানি না এটি সমস্ত প্রোগ্রামিং ভাষার ক্ষেত্রে প্রযোজ্য কিনা, তবে পিএইচপি "সুরক্ষিত" বৈশিষ্ট্য / পদ্ধতিগুলিতে যে শ্রেণিতে এটি ঘোষিত হয়েছে বা শ্রেণিগুলি সম্পত্তি / পদ্ধতি নির্ধারণ করে এমন শ্রেণিতে প্রবেশ করা যেতে পারে।
জন স্লেজার 0

25

পার্থক্যটি নিম্নরূপ:

Public :: কোনও পাবলিক ভেরিয়েবল বা পদ্ধতি ক্লাসের যে কোনও ব্যবহারকারীর দ্বারা সরাসরি অ্যাক্সেস করা যায়।

Protected :: একটি সুরক্ষিত পরিবর্তনশীল বা পদ্ধতি শ্রেণীর ব্যবহারকারীদের দ্বারা অ্যাক্সেস করা যায় না তবে ক্লাস থেকে উত্তরাধিকারসূত্রে একটি সাবক্লাসের ভিতরে প্রবেশ করা যায়।

Private :: একটি প্রাইভেট ভেরিয়েবল বা পদ্ধতি কেবলমাত্র শ্রেণি থেকে অভ্যন্তরীণভাবে প্রবেশ করা যায় যেখানে এটি সংজ্ঞায়িত হয়েছে his এর অর্থ হ'ল শ্রেণীর প্রসারিত বাচ্চা থেকে একটি ব্যক্তিগত ভেরিয়েবল বা পদ্ধতি কল করা যায় না।


17

বিমূর্ত উদাহরণ সহ দৃশ্যমানতার সুযোগগুলি :: সহজ বোঝাপড়া করে

কোনও সম্পত্তি বা পদ্ধতির এই দৃশ্যমানতাটি তিনটি মূলশব্দের (জনসাধারণ, সুরক্ষিত এবং বেসরকারী) প্রাক-ফিক্সিং ঘোষণার মাধ্যমে সংজ্ঞায়িত করা হয়েছে

সর্বজনীন : যদি কোনও সম্পত্তি বা পদ্ধতিটিকে জনসাধারণ হিসাবে সংজ্ঞায়িত করা হয় তবে এর অর্থ এটি অ্যাক্সেস এবং অবজেক্টকে নির্দেশ করতে পারে এমন কোনও কিছু দ্বারা হেরফের হতে পারে।

  • বিমূর্ত উদাহরণ জনসাধারণের দৃশ্যমানতার সুযোগটিকে "পাবলিক পিকনিক" হিসাবে ভাবেন যাতে যে কেউ আসতে পারে।

সুরক্ষিত: যখন কোনও সম্পত্তি বা পদ্ধতির দৃশ্যমানতা সুরক্ষিত সদস্যদের জন্য সেট করা থাকে কেবল তখন বর্গের মধ্যেই এবং উত্তরাধিকারসূত্রে ও উত্তরাধিকারসূত্রে ক্লাসের মাধ্যমে অ্যাক্সেস পাওয়া যায়। (উত্তরাধিকারসূত্রে: - একটি শ্রেণীর অন্য শ্রেণীর সমস্ত বৈশিষ্ট্য এবং পদ্ধতি থাকতে পারে)।

  • "কোম্পানির পিকনিক" হিসাবে সুরক্ষিত দৃশ্যমানতার সুযোগ হিসাবে ভাবেন যেখানে কোম্পানির সদস্য এবং তাদের পরিবারের সদস্যদের জনসাধারণের কাছে অনুমোদিত নয়। এটি সবচেয়ে সাধারণ সুযোগ সীমাবদ্ধতা।

ব্যক্তিগত: যখন কোনও সম্পত্তি বা পদ্ধতির দৃশ্যমানতা ব্যক্তিগততে সেট করা থাকে, কেবল শ্রেণীর যে ব্যক্তিগত সদস্য রয়েছে সেগুলি শ্রেণিগত যে কোনও সম্পর্ক থাকতে পারে সত্ত্বেও সেই পদ্ধতিগুলি এবং বৈশিষ্ট্যগুলি (অভ্যন্তরীণভাবে শ্রেণীর মধ্যে) অ্যাক্সেস করতে পারে।

  • পিকনিক উপমা দিয়ে পিকনিকে "কোম্পানির পিকনিক যেখানে কেবলমাত্র কোম্পানির সদস্যরা অনুমোদিত" হিসাবে ভাবেন । পরিবার নয়, সাধারণ জনগণকেও অনুমোদিত নয়।

15
/**
 * Define MyClass
 */
class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj = new MyClass();
echo $obj->public; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private


/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // We can redeclare the public and protected method, but not private
    protected $protected = 'Protected2';

    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

$obj2 = new MyClass2();
echo $obj2->public; // Works
echo $obj2->private; // Undefined
echo $obj2->protected; // Fatal Error
$obj2->printHello(); // Shows Public, Protected2, Undefined

থেকে নিষ্কাশিত :

http://php.net/manual/en/language.oop5.visibility.php


12

⚡️ এখানে একটি সহজ উপায় পরিধি স্মরণ হয় public, protectedএবং private

PUBLIC:

  • public সুযোগ: একটি পাবলিক ভেরিয়েবল / ফাংশন উভয় অবজেক্ট এবং অন্যান্য শ্রেণীর জন্য উপলব্ধ।

PROTECTED:

  • protected সুযোগ: বর্তমান শ্রেণীর প্রসারিত সমস্ত শ্রেণীর জন্য একটি সুরক্ষিত ভেরিয়েবল / ফাংশন উপলব্ধ।
  • না! অবজেক্টস এই সুযোগ অ্যাক্সেস করতে পারে না

PRIVATE:

  • private সুযোগ: একটি ব্যক্তিগত ভেরিয়েবল / ফাংশন কেবল বর্তমান শ্রেণিতে দৃশ্যমান যেখানে এটি সংজ্ঞায়িত করা হচ্ছে being
  • না! বর্তমান শ্রেণীর প্রসারিত ক্লাস এই সুযোগটি অ্যাক্সেস করতে পারে না।
  • না! অবজেক্টস এই সুযোগ অ্যাক্সেস করতে পারে না।

কোনও পদ্ধতির দৃশ্যমানতা বা পিএইচপি ম্যানুয়ালে পরিবর্তনশীল পড়ুন ।


9

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

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

একটি privateপদ্ধতির একটি ভাল কারণ হ'ল এটি সেই বস্তুর অন্তর্নিহিত এমন কিছু কার্যকর করে যে এমনকি একটি বর্ধিত শ্রেণিও পরিবর্তন করা উচিত নয় (অভ্যন্তরীণ রাজ্য ব্যবস্থাপনার মতো এনক্যাপসুলেশন ছাড়াও বাস্তব কারণ)। অবশেষে, কোনও protectedপদ্ধতি সাধারণত কোথায় ব্যবহৃত হচ্ছে তা ট্র্যাক করা এখনও সহজ so তাই protectedআজকাল আমি ডিফল্ট । "খন্দকের" অভিজ্ঞতা হতে পারে 100% উদ্দেশ্য নয়, আমি স্বীকার করি।


3
আপনার আপডেটের সাথে: আপনি কীভাবে এখানে "যথেষ্ট যথেষ্ট" এবং "ভাল কারণ" একসাথে আরও পরিষ্কার করতে পারেন? উদাহরণস্বরূপ, ব্যবহার privateকরা এখনও "যথেষ্ট ভাল" হিসাবে ব্যবহার করা হবে তবে আপনি আগের কারণগুলিকে কোনও "ভাল কারণ" বলে এখনও সাড়া দেওয়ার পরামর্শ দিচ্ছেন না: এনক্যাপসুলেশন।
hakre

@ হাক্রে: যে কারণে এনক্যাপসুলেশনের জন্য আমাদের প্রচেষ্টা করা উচিত তা হ'ল বাইরের ক্ষেত্রের মধ্যে ফাঁস হওয়া অবস্থা এড়ানো। protectedএটি ইতিমধ্যে করে তবে আপনি এটি সম্প্রসারণ / উত্তরাধিকারের জন্য নমনীয় রাখেন। আবার, যদি না এটি তৈরি করার উপযুক্ত কারণ থাকে private
ড্যানমান

ঠিক এটিই আমরা সম্ভবত মতামত করি না: protectedপ্রকৃতপক্ষে বাহ্যিক ক্ষেত্রের মধ্যে ফাঁস হয়ে যায় এবং এটি প্রায়শই আপনার পথে থাকে কারণ এটি খারাপ নকশার সিদ্ধান্তগুলিকে সমর্থন করে যেমন উত্তরাধিকারের পক্ষে হয় যখন এটি রচনার পক্ষে হওয়া আরও ভাল। এই কারণেই আপনার ব্যক্তিগত প্রয়োজনীয়তা না থাকলে ব্যক্তিগত সাথে স্টিক করা কোডটি লেখার শুরু করার সবচেয়ে ভাল উপায়। এটি খুব শীঘ্রই ডিজাইনের সিদ্ধান্ত নিতে বাধা দেবে যখন তারা আসলে এখনও প্রয়োজন হয়নি।
hakre

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

6

পিএইচপি ম্যানুয়াল এখানে প্রশ্ন ভাল পড়া আছে

কোনও সম্পত্তি বা পদ্ধতির দৃশ্যমানতা জনসাধারণ, সুরক্ষিত বা ব্যক্তিগত কীওয়ার্ড সহ ঘোষণার উপসর্গ দ্বারা সংজ্ঞায়িত করা যেতে পারে। ঘোষিত শ্রেণীর সদস্যদের সর্বত্র অ্যাক্সেস করা যেতে পারে। সুরক্ষিত হিসাবে ঘোষিত সদস্যরা কেবল বর্গের মধ্যেই এবং উত্তরাধিকার সূত্রে প্রাপ্ত এবং পিতামাতার ক্লাসগুলির মাধ্যমে অ্যাক্সেস করতে পারে। ব্যক্তিগত হিসাবে ঘোষিত সদস্যরা কেবল সদস্যকে সংজ্ঞায়িত ক্লাস দ্বারা অ্যাক্সেস করতে পারে।


6

আমার জন্য, এটি সবচেয়ে দরকারী তিনটি প্রকারের প্রকার বোঝার উপায়:

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

শ্রেণীর বাইরে থেকে ব্যবহারের উদাহরণ:

$myObject = new MyObject()
$myObject->publicVar = 'newvalue';
$pubVar = $myObject->publicVar;

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

কেন? কারণ আপনি যদি ভবিষ্যতের কোনও মুহূর্তে (সম্ভবত 5 মিনিটের মতোও) সিদ্ধান্ত নিয়ে থাকেন যে আপনি সেই সম্পত্তির জন্য যে মূল্য ফিরে পেয়েছেন তা হেরফের করতে চান বা পেতে / সেটিংয়ের আগে এটি দিয়ে কিছু করতে চান, আপনি যে কোনও জায়গায় রিফ্যাক্টর না করেই তা করতে পারেন আপনার প্রকল্পে এটি ব্যবহার।

শ্রেণীর বাইরে থেকে ব্যবহারের উদাহরণ:

$myObject = new MyObject()
$myObject->setProtectedVar('newvalue');
$protectedVar = $myObject->getProtectedVar();

প্রাইভেট : privateপ্রোপার্টি বৈশিষ্ট্যের সাথে খুব মিল protected। তবে স্বতন্ত্র বৈশিষ্ট্য / পার্থক্যটি এটি তৈরি করাprivate পিতামাতার শ্রেণীর গেটর বা সেটার ব্যবহার না করে শিশু শ্রেণিতেও অ্যাক্সেসযোগ্য করে তুলেছে।

সুতরাং মূলত, যদি আপনি কোনও সম্পত্তির জন্য গেটার্স এবং সেটারগুলি ব্যবহার করেন (বা যদি এটি কেবল পিতামাতা বর্গ দ্বারা অভ্যন্তরীণভাবে ব্যবহৃত হয় এবং এটি অন্য কোথাও অ্যাক্সেসযোগ্য বলে বোঝানো না হয়) তবে আপনি সম্ভবত এটি তৈরি করতে পারেন private, কাউকে চেষ্টা থেকে বিরত রাখতে এটি সরাসরি ব্যবহার করতে এবং বাগগুলি প্রবর্তন করতে

শিশু শ্রেণীর অভ্যন্তরে ব্যবহারের উদাহরণ (এটি মাইবজেক্ট প্রসারিত):

$this->setPrivateVar('newvalue');
$privateVar = $this->getPrivateVar();


4

পিএইচপি-তে চলকগুলি তিনটি ভিন্ন ধরণের কাস্ট করা হয়:

সর্বজনীন: এই পরিবর্তনশীল ধরণের মানগুলি সমস্ত সুযোগে উপলব্ধ এবং আপনার কোডটি কার্যকর করার জন্য কল করে। হিসাবে ঘোষণা করুন:public $examTimeTable;

ব্যক্তিগত: এই ধরণের ভেরিয়েবলের মানগুলি কেবলমাত্র তার শ্রেণীর জন্য উপলব্ধ। private $classRoomComputers;

সুরক্ষিত: কেবলমাত্র এই শ্রেণীর মান এবং কেবল তখনই উপলভ্য যখন আনুষাঙ্গিক বা তাদের শিশু শ্রেণির একরূপে অ্যাক্সেস দেওয়া হয়। সাধারণত ::অভিভাবক শ্রেণীর দ্বারা অ্যাক্সেস মঞ্জুর করতে ব্যবহৃত হয়

protected $familyWealth;


3

একটি পুরানো প্রশ্ন পুনরুদ্ধার করা, তবে আমি মনে করি এটির সত্যিকারের ভাল উপায়টি আপনি যে API এর সংজ্ঞা দিচ্ছেন তার নিরিখে।

  • public - সর্বজনীন হিসাবে চিহ্নিত সমস্ত কিছু সেই এপিআই-র অংশ যা আপনার শ্রেণি / ইন্টারফেস / অন্যান্য ব্যবহার করে যে কেউ ব্যবহার করবে এবং তার উপর নির্ভর করবে।

  • protected- বোকা বোকা না, এটিও এপিআই-র অংশ! লোকেরা সাবক্লাস করতে পারে, আপনার কোডটি প্রসারিত করতে পারে এবং সুরক্ষিত হিসাবে চিহ্নিত কিছু ব্যবহার করতে পারে।

  • private- ব্যক্তিগত সম্পত্তি এবং পদ্ধতিগুলি আপনার পছন্দমতো পরিবর্তন করা যেতে পারে। এগুলি আর কেউ ব্যবহার করতে পারে না। ব্রেকিং পরিবর্তন না করে কেবলমাত্র এগুলিই আপনি পরিবর্তন করতে পারবেন।

অথবা সেমভার পদগুলিতে:

  • যে কোনও কিছুর পরিবর্তন publicবা protectedমেজর পরিবর্তন বিবেচনা করা উচিত।

  • যে কোনও নতুন publicবা protectedকমপক্ষে (কমপক্ষে) MINOR হওয়া উচিত

  • কেবল নতুন / কিছুতে পরিবর্তনগুলি privateপ্যাচ হতে পারে

সুতরাং কোড বজায় রাখার ক্ষেত্রে আপনি কোন জিনিসগুলি তৈরি করেন publicবা protectedআপনার ব্যবহারকারীদের কাছে প্রতিশ্রুতি দেওয়া হচ্ছে সেগুলি সম্পর্কে সতর্ক থাকা ভাল ।


1

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

  1. পাবলিক
  2. ব্যক্তিগত
  3. সংরক্ষিত

অ্যাক্সেস মডিফায়ার অ্যাক্সেস স্তর বুঝতে এখন আমাদের নীচের চিত্রটি দেখে নেওয়া যাক এখানে চিত্র বর্ণনা লিখুন

অ্যাক্সেস মডিফায়ার হিসাবে ব্যবহৃত সম্ভাব্য পিএইচপি কীওয়ার্ডগুলি সম্পর্কে এখন জানতে আমাদের নীচের তালিকার এক ঝলক দেখি।

সর্বজনীন: - শ্রেণি বা এই অ্যাক্সেস মডিফায়ারের সাথে সংজ্ঞায়িত এর সদস্যরা ক্লাসের বাইরেও এমনকি কোথাও থেকে সর্বজনীনভাবে অ্যাক্সেসযোগ্য হবে।

প্রাইভেট: - এই কীওয়ার্ড সহ শ্রেণীর সদস্যদের ক্লাসের মধ্যেই অ্যাক্সেস করা হবে। আমরা সাবক্লাস থেকে ব্যক্তিগত ডেটা অ্যাক্সেস করতে পারি না। এটি সদস্যদের বাইরের শ্রেণীর অ্যাক্সেস থেকে রক্ষা করে।

সুরক্ষিত: - সুরক্ষিত সুপারক্লাস সদস্যদের অ্যাক্সেস করার জন্য সাবক্লাসগুলি অনুমতি দেওয়া ব্যতীত ব্যক্তিগত হিসাবে একই same

অ্যাক্সেস মডিফায়ার বুঝতে এখন টেবিলটি দেখুন পুরো নিবন্ধটি পড়ুন পিএইচপি অ্যাক্সেস মোডিফায়ার


1

Public: আপনি একটি ভেরিয়েবল বা পদ্ধতি ঘোষণা করার সময় একটি ডিফল্ট অবস্থা, সরাসরি কোনও বস্তুতে সরাসরি অ্যাক্সেস করা যায়।

Protected: কেবলমাত্র অবজেক্ট এবং সাবক্লাসের মধ্যে অ্যাক্সেস করা যায়।

Private: কেবলমাত্র বস্তুর মধ্যে উল্লেখ করা যেতে পারে, সাবক্লাস নয়।


0

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

ব্যক্তিগত - কেবলমাত্র বর্তমান শ্রেণীর ক্ষেত্রে ক্ষেত্র বা পদ্ধতিতে অ্যাক্সেস থাকবে।

সুরক্ষিত - এই বর্গের কেবলমাত্র বর্তমান বর্গ এবং সাবক্লাসগুলি (এবং কখনও কখনও একই প্যাকেজ ক্লাসগুলি) ক্ষেত্রে ক্ষেত্র বা পদ্ধতিতে অ্যাক্সেস পাবেন।

সর্বজনীন - যে কোনও শ্রেণি ক্ষেত্রটি উল্লেখ করতে পারে বা পদ্ধতিটি কল করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.