රාජ්‍ය, පෞද්ගලික සහ ආරක්‍ෂිත අතර ඇති වෙනස කුමක්ද?


1002

හා ඇයි මම භාවිතා කළ යුතු public, private, හා protectedපන්ති තුල කාර්යයන් හා විචල්යයන්? ඔවුන් අතර ඇති වෙනස කුමක්ද?

උදාහරණ:

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

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

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

60
එක් එක් මූලපදය කරන දේ පිළිබඳ වචනානුසාරයෙන් අර්ථ දැක්වීම සැපයීම වෙනුවට, එක් එක් භාවිතය පිළිබඳ ප්‍රායෝගික උදාහරණ සහිත පිළිතුරු වලින් මෙම ප්‍රශ්නය ප්‍රයෝජනවත් වනු ඇතැයි මම සිතමි.
මැතිව්

71
මම ඇත්තටම සිතන්නේ මෙම ප්‍රශ්නය ආරක්ෂා විය යුතු නොව ප්‍රසිද්ධ විය යුතු බවයි.
dotancohen

Answers:


1277

ඔබ භාවිතා කරන:

  • public එම දේපල / ක්‍රමය ඕනෑම තැනකින්, වෙනත් පංතිවලින් සහ වස්තුවෙන් ලබා ගත හැකි විෂය පථය.

  • private ඔබේ දේපල / ක්‍රමය එහි පන්තියේ පමණක් දැකීමට අවශ්‍ය විට විෂය පථය.

  • protected මව් පංතිය ඇතුළුව වර්තමාන පන්තිය දීර් extend කරන සියලුම පන්තිවල ඔබේ දේපල / ක්‍රමය දෘශ්‍යමාන කිරීමට අවශ්‍ය විට විෂය පථය.

ඔබ දෘශ්‍යතා විකරණකාරකයක් භාවිතා නොකරන්නේ නම්, දේපල / ක්‍රමය පොදු වේ.

තවත්: (සවිස්තරාත්මක තොරතුරු සඳහා)


80
protectedවත්මන් පංතිය සහ එහි මව් පංති දීර් extend කරන සියලුම පන්තිවල ඔබේ විචල්‍යය / ක්‍රියාකාරිත්වය දෘශ්‍යමාන කිරීමට අවශ්‍ය විට විෂය පථය .
ෂාහිඩ්

4
Ha ෂාහිඩ් - මට ඔබේ අදහස තේරෙන්නේ නැහැ. A පන්තිය දීර් extend කරන ඕනෑම පන්තියක් A හි මව් පන්තිය ද දීර් extend කරයි, නැත?
JDelage

4
@JDelage - කරුණාකර සබැඳිය බලන්නhttp://www.php.net/manual/en/language.oop5.visibility.php#109324
ෂහීඩ්

4
Rrowrowler එසේනම් වස්තූන් භාවිතා කිරීමට කරදර වන්නේ ඇයි?
ජේ. ස්ටීව්

27
Rrow ග්‍රෝලර්, වඩාත් ප්‍රයෝජනවත් පිළිතුරක් වනුයේ වස්තුවක අභ්‍යන්තර ක්‍රියාකාරකම් හැකිතාක් සැඟවීම හොඳ බවය. ඒ ආකාරයෙන් එය කැඩීමට ඇති ඉඩකඩ අඩුය. ඔබ සෑම දෙයක්ම ප්‍රසිද්ධ කළහොත්, වෙනත් ක්‍රමලේඛකයෙකු ඔබේ වස්තුවේ අභ්‍යන්තර ක්‍රියාකාරකම් හැර වෙනත් කිසිවක් මගින් වෙනස් කිරීමට අවශ්‍ය නොවන විචල්‍යයක් වෙනස් කළ හැකිය.
සයිප්‍රසයේ ලිහිල් කිරීම

1186

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

නිවැරදි දෝෂය මෙය වනු ඇත:

PHP මාරක දෝෂය: ආරක්ෂිත දේපල වෙත ප්‍රවේශ විය නොහැක GrandPa :: $ name


පුද්ගලික:

ඔබ ක්‍රමයක් (ශ්‍රිතයක්) හෝ දේපලක් (විචල්‍යයක්) ලෙස ප්‍රකාශ කරන විට 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

නිවැරදි දෝෂ පණිවිඩ වනුයේ:

දැනුම්දීම: නිර්වචනය නොකළ දේපල: තාත්තා :: $ නම
මාරක දෝෂය: පුද්ගලික දේපල වෙත ප්‍රවේශ විය නොහැක GrandPa :: $ name


පරාවර්තනය භාවිතා කරමින් සීයා පන්තිය විසුරුවා හැරීම

මෙම විෂය සැබවින්ම විෂය පථයෙන් බැහැර නොවන අතර පරාවර්තනය සැබවින්ම බලවත් බව ඔප්පු කිරීම සඳහා මම එය මෙහි එක් කරමි. ඉහත උදාහරණ තුනෙහි මා සඳහන් කළ පරිදි, protectedසහprivate සාමාජිකයන් (ගුණ හා ක්රම) පන්ති පිටත ප්රවේශ විය නොහැක.

කෙසේ වෙතත්, පිළිබිඹු සමග ඔබ කරන්න පුළුවන් අමතර-සාමාන්ය පවා පිවිසීමේදී විසින් protectedහාprivate පංතියෙන් පිටත සාමාජිකයින්ට !

හොඳයි, පරාවර්තනය යනු කුමක්ද?

පරාවර්තනය මඟින් ප්‍රතිලෝම-ඉංජිනේරු පන්ති, අතුරුමුහුණත්, කාර්යයන්, ක්‍රම සහ දිගු කිරීමේ හැකියාව එක් කරයි. මීට අමතරව, ඔවුන් කාර්යයන්, පන්ති සහ ක්‍රම සඳහා doc අදහස් ලබා ගැනීමට ක්‍රම ඉදිරිපත් කරයි.

පෙරවදන

අපට පංතියක් නම් කර ඇති 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ඩිබගර් කාර්යයන් . ඔවුන් විචල්‍යයක් පිළිබඳ තොරතුරු මිනිස් කියවිය හැකි ආකාරයෙන් ඉදිරිපත් කරයි. මෙම කාර්යයන් තුනෙන් PHP 5 සමඟ ඇති වස්තූන්ගේ protectedහා privateගුණාංග අනාවරණය වේ . ස්ථිතික පන්තියේ සාමාජිකයන් පෙන්වන්නේ නැත .


තවත් සම්පත්:



ප්‍රමාද වී සමාව අයැද සිටින්න. කවුරුහරි මේවා භාවිතා කරන්නේ ඇයි කියා මට කියන්න පුළුවන්ද? ඔවුන් ක්‍රියා කරන ආකාරය ඔබ හොඳින් විස්තර කර ඇත. මේ සෑම එකක් සඳහාම භාවිතා කිරීමේ ප්‍රතිලාභ දැන ගැනීමට මම කැමතියි. ස්තූතියි
ජේම්ස් ජී

Ame ජේම්ස් ජී එහි අනෙක් විවරණයෙන් ටිකක් විස්තර කර ඇත. stackoverflow.com/questions/4361553/…
cjmling

සමහර විට එය මෙම ප්‍රශ්නයෙන් මඳක් out ත් වන්නේ මන්දැයි මම නොදනිමි, නමුත් PHP හි තවත් ප්‍රවේශ විකරණකාරක දෙකක් ඇති බව කිසිවෙකු සඳහන් කර නැත: වියුක්ත හා අවසාන මෙම පදය PHP පන්ති සඳහා පමණක් භාවිතා කළ හැකි නමුත් එය තවමත් නවීකරණය
කරන්නන්ට

1
ධර්යා ලඛෙරා විසින් සපයන ලද වියුක්තකරණය පිළිබඳ පැහැදිලි කිරීම මෙතැනින් කියවන්නැයි මම ඔබට යෝජනා කරමි: stackoverflow.com/questions/2558559/… . එය ශංකර් දමෝදරන් පැහැදිලි කිරීම් සඳහා පරිපූර්ණ එකතු කිරීමකි.
ජුලියෝ මාර්චි

වචන කියවන්නේ ඇයි .. පින්තූරය ඒ සියල්ල පවසන විට;)
ජොනෝ

84

සාමාන්‍යයෙන් දත්ත සංවර්‍ධනය සහ හොඳ අතුරුමුහුණත් සැලසුම් කිරීම ප්‍රවර්ධනය කරන බැවින් අවශ්‍ය අවම දෘශ්‍යතාවයට පෙරනිමියෙන් සිටීම හොඳ පුරුද්දක් ලෙස සැලකේ. සාමාජික විචල්‍යය සහ ක්‍රමයේ දෘශ්‍යතාව සලකා බැලීමේදී සාමාජිකයා වෙනත් වස්තූන් සමඟ අන්තර්ක්‍රියා කිරීමේදී ඉටු කරන කාර්යභාරය ගැන සිතා බලන්න.

ඔබ "ක්‍රියාත්මක කිරීමට වඩා අතුරු මුහුණතකට කේත කරන්නේ නම්" සාමාන්‍යයෙන් දෘශ්‍යතා තීරණ ගැනීම ඉතා සරල ය. පොදුවේ ගත් කල, විචල්‍යයන් හෙළි කිරීමට ඔබට හොඳ හේතුවක් නොමැති නම් පුද්ගලික හෝ ආරක්‍ෂිත විය යුතුය. පංතියේ අභ්‍යන්තරයට ප්‍රවේශය සීමා කිරීම සහ නියාමනය කිරීම වෙනුවට පොදු ප්‍රවේශයන් (ලබා ගන්නන් / සැකසුම් කරන්නන්) භාවිතා කරන්න.

මෝටර් රථයක් ප්‍රතිසමයක් ලෙස භාවිතා කිරීමට, වේගය, ආම්පන්න සහ දිශාව වැනි දේ පුද්ගලික උදාහරණ විචල්‍යයන් වේ. වාතය / ඉන්ධන අනුපාතය වැනි දේ රියදුරු කෙලින්ම හැසිරවීමට ඔබට අවශ්‍ය නැත. ඒ වෙනුවට, ඔබ පොදු ක්‍රියාමාර්ග ලෙස සීමිත ක්‍රියා සංඛ්‍යාවක් හෙළි කරයි. මෝටර් රථයක් සඳහා අතුරු මුහුණත් වැනි ක්රම ද ඇතුළත් විය හැකිය accelerate(), deccelerate()/ brake(), setGear(), turnLeft(), turnRight(), ආදිය

මෝටර් රථයේ අභ්‍යන්තරිකයින් විසින් මෙම ක්‍රියාවන් ක්‍රියාත්මක කරන්නේ කෙසේදැයි රියදුරු නොදන්නා අතර ඔහු සැලකිලිමත් නොවිය යුතු අතර, එම ක්‍රියාකාරිත්වය හෙළිදරව් කිරීම රියදුරුට සහ මාර්ගයේ සිටින අනෙක් අයට අනතුරුදායක විය හැකිය. එබැවින් පොදු අතුරු මුහුණතක් සැලසුම් කිරීම සහ එම අතුරුමුහුණත පිටුපස ඇති දත්ත සංයුක්ත කිරීම පිළිබඳ හොඳ පුරුද්ද.

ග්‍රාහක කේතය සමඟ අතුරුමුහුණතෙහි ගිවිසුම කඩ නොකර ඔබේ පන්තියේ පොදු ක්‍රමවේදයන් වෙනස් කිරීමට සහ වැඩිදියුණු කිරීමට මෙම ප්‍රවේශය ඔබට ඉඩ සලසයි. උදාහරණයක් ලෙස, ඔබට එය වැඩිදියුණු කළ හැකියaccelerate() වඩා ඉන්ධන කාර්යක්ෂම ක්‍රමවේදය නමුත්, එම ක්‍රමයේ භාවිතය එලෙසම පවතිනු ඇත; සේවාදායක කේතයට කිසිදු වෙනසක් අවශ්‍ය නොවන නමුත් ඔබේ කාර්යක්ෂමතාව වැඩිදියුණු කිරීමේ ප්‍රතිලාභ ලබා ගනී.

සංස්කරණය කරන්න: ඔබ තවමත් වස්තු නැඹුරු සංකල්ප ඉගෙන ගනිමින් සිටින බව පෙනේ (ඒවා ඕනෑම භාෂාවක වාක්‍ය ඛණ්ඩයකට වඩා ප්‍රගුණ කිරීම දුෂ්කර ය), මැට් සැන්ඩ්ස්ට්‍රා විසින් PHP වස්තු, රටා සහ පුහුණුවීම්වල පිටපතක් ලබා ගැනීමට මම තරයේ නිර්දේශ කරමි. වාක්‍ය ඛණ්ඩය මට ඉගැන්වීමට වඩා OOP effectively ලදායී ලෙස භාවිතා කරන්නේ කෙසේදැයි මට මුලින්ම ඉගැන්වූ පොත මෙයයි . මම වසර ගණනාවකට පෙර වාක්‍ය ඛණ්ඩය ඉගෙන ගෙන ඇති නමුත් ඕඕපී හි “ඇයි” ​​යන්න තේරුම් නොගෙන එය නිෂ් less ල විය.


3
මෙම ලිපියේ සංස්කරණයේ නිර්දේශිත පොත ඇත්තෙන්ම ඉතා විශිෂ්ටයි. මා මෙතෙක් කර ඇති කුට්ටිය තරමක් බුද්ධිමත් බව ඔප්පු කර ඇත. පළමු පරිච්ඡේද කිහිපය මගේ පන්ති ආශ්‍රිත ප්‍රශ්න බොහොමයකට පිළිතුරු සපයයි.
ජොෂියා

Smalltalk දී උදාහරණ වැනි අනවශ්ය විස්තර, මගේ චින්තනය සිදු වැළ නොකැඩී පැමිණෙමින් තොරව, මට ඇත්තටම වස්තු තේරුම් ගැනීමට ඉඩ තිබෙන පොත්, වීම, දාවිත් ටේලර් විසින් විය ඒ කළමනාකරු මාර්ගෝපදේශනයක්: තාක්ෂණ පිණිසයි වස්තූන් හා වස්තූන් Teechnology සමග ව්යාපාරික ඉංජිනේරු . දෙකම පිටු 100 ක් පමණක් වන අතර සෑම එකක්ම දහවල් කාලයේදී කියවීමට පහසුය. ඇත්ත වශයෙන්ම, ගැමා සහ වෙනත් අයගේ සැලසුම් රටා ඇත , නමුත් මූලික ප්‍රවේශය සරලව විස්තර කළ හැක්කේ 'ඔබට වෙනස් වීමට අවශ්‍ය දේ උපවර්ගය' මගින් ය.
පතංජලී

ඉතා හොඳ ප්‍රතිසමයක්. ආරක්ෂිත එදිරිව පුද්ගලික සඳහා ඔබට එකක් තිබේද?
ජැනිස් එල්මරිස්

81

private - පන්තියෙන් පමණක් ප්‍රවේශ විය හැකිය

protected - පන්තියෙන් සහ INHERITING පන්ති වලින් ප්‍රවේශ විය හැකිය

public - පන්තියෙන් පිටත කේතයෙන්ද ප්‍රවේශ විය හැකිය

මෙය ශ්‍රිතයන්ට මෙන්ම විචල්‍යයන්ටද අදාළ වේ.


ආරක්ෂිත අර්ථ දැක්වීම මෙහි නිවැරදි දැයි විශ්වාස නැත, ඇත්ත වශයෙන්ම තෝරාගත් පිළිතුරෙන් පෙනෙන පරිදි, ආරක්ෂිතයි - ප්‍රවේශ විය හැක්කේ උරුම වූ පන්තියේ සිට මිස මුල් / මව් පන්තියෙන් නොවේ. "පන්තිය සමඟ" යැයි පැවසීම ටිකක් ව්‍යාකූල විය හැකිය.
pal4life

7
මම හිතන්නේ නැහැ, ඇත්ත වශයෙන්ම තෝරාගත් පිළිතුර මෙහි අවුල් සහගත බව පෙනේ. ෂහීඩ්ස්ගේ අදහස බලන්න. IMHO ආරක්ෂිත ක්‍රමයක් මුල් පන්තියේ සිටම ප්‍රවේශ විය හැකිය.
ඔලාෆ්

පන්තියකට වෙනත් පන්තියක මහජනතාවට ප්‍රවේශ විය හැකිද?
සර්ජාස්

1
Er සර්ජාස්: නැත, ස්ථිතික ක්‍රම / ක්ෂේත්‍ර හැර වෙනත් වස්තුවක් පමණි.
ඩෑන්මන්

මෙය සියලුම ක්‍රමලේඛන භාෂාවන්ට අදාළ වේදැයි මම නොදනිමි, නමුත් PHP හි “ආරක්‍ෂිත” ගුණාංග / ක්‍රම ප්‍රකාශයට පත් කර ඇති පන්තියට හෝ දේපල / ක්‍රමය නිර්වචනය කරන පන්තියෙන් උරුම වූ පන්ති වලට ප්‍රවේශ විය හැකිය.
ජෝන් ස්ලෙගර්ස්

25

වෙනස පහත පරිදි වේ:

Public :: පොදු විචල්‍යයක් හෝ ක්‍රමයක් පන්තියේ ඕනෑම පරිශීලකයෙකුට කෙලින්ම ප්‍රවේශ විය හැකිය.

Protected :: ආරක්ෂිත විචල්‍යයක් හෝ ක්‍රමයක් පන්තියේ පරිශීලකයින්ට ප්‍රවේශ කළ නොහැකි නමුත් පන්තියෙන් උරුම වන උප පංතියක් තුළට ප්‍රවේශ විය හැකිය.

Private :: පුද්ගලික විචල්‍යයකට හෝ ක්‍රමයකට ප්‍රවේශ විය හැක්කේ එය නිර්වචනය කර ඇති පන්තියෙන් පමණි. මෙයින් අදහස් කරන්නේ පන්තිය දීර් extend කරන දරුවෙකුගෙන් පුද්ගලික විචල්‍යයක් හෝ ක්‍රමයක් කැඳවිය නොහැකි බවයි.


18

වියුක්ත උදාහරණ සහිත දෘශ්‍යතා විෂය පථයන් :: පහසුවෙන් තේරුම් ගත හැකිය

දේපලක හෝ ක්‍රමයක මෙම දෘශ්‍යතාව අර්ථ දැක්වෙන්නේ මූල පද තුනෙන් එකක් (රාජ්‍ය, ආරක්ෂිත සහ පෞද්ගලික) පූර්ව නිශ්චය කිරීමෙනි.

පොදු : දේපලක් හෝ ක්‍රමයක් පොදු ලෙස අර්ථ දක්වා තිබේ නම්, එයින් අදහස් වන්නේ එය වස්තුවට යොමු විය හැකි ඕනෑම දෙයකින් ප්‍රවේශ විය හැකි සහ හැසිරවිය හැකි බවයි.

  • සාරාංශය උදා. මහජන දෘශ්‍යතා විෂය පථය ඕනෑම කෙනෙකුට පැමිණිය හැකි “පොදු විනෝද චාරිකාවක්” ලෙස සිතන්න .

ආරක්ෂිතයි: ආරක්ෂිත සාමාජිකයින්ට දේපලක් හෝ ක්‍රම දෘශ්‍යතාවයක් සකසා ඇති විට ප්‍රවේශ විය හැක්කේ පන්තිය තුළම සහ උරුම වූ සහ උරුම වූ පන්ති වලින් පමණි. (උරුමය: - පන්තියකට වෙනත් පන්තියක සියලු ගුණාංග හා ක්‍රම තිබිය හැකිය).

  • ආරක්ෂිත දෘශ්‍යතා විෂය පථයක් ලෙස "සමාගම් විනෝද චාරිකාවක්" ලෙස සිතන්න, එහිදී සමාගම් සාමාජිකයින්ට සහ ඔවුන්ගේ පවුලේ සාමාජිකයින්ට මහජනයාට ඉඩ නොදේ. එය වඩාත් පොදු විෂය පථය සීමා කිරීමකි.

පුද්ගලික: දේපළක් හෝ ක්‍රම දෘශ්‍යතාවයක් පුද්ගලිකව සකසා ඇති විට, කුමන පන්ති සම්බන්ධතාවයක් තිබියදීත්, එම ක්‍රම සහ දේපල (අභ්‍යන්තරව පන්තිය තුළ) වෙත ප්‍රවේශ විය හැක්කේ පුද්ගලික සාමාජිකයන් සිටින පන්තියට පමණි.

  • විනෝද චාරිකා සඳහා "සමාගම් සාමාජිකයින්ට පමණක් අවසර දී ඇති සමාගම් විනෝද චාරිකාවක්" ලෙස සිතන්න . පවුලට හෝ සාමාන්‍ය ජනතාවට අවසර නැත.

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 විෂය පථය: වත්මන් පන්තිය දීර් extend කරන සියලුම පන්ති සඳහා ආරක්ෂිත විචල්‍යයක් / ශ්‍රිතයක් ලබා ගත හැකිය.
  • නැත! වස්තූන්ට මෙම විෂය පථයට ප්‍රවේශ විය නොහැක

PRIVATE:

  • private විෂය පථය: පුද්ගලික විචල්‍යයක් / ශ්‍රිතයක් දෘශ්‍ය වන්නේ එය අර්ථ දක්වා ඇති වත්මන් පන්තියේ පමණි.
  • නැත! වත්මන් පන්තිය දීර් extend කරන පන්තියට මෙම විෂය පථයට ප්‍රවේශ විය නොහැක.
  • නැත! වස්තූන්ට මෙම විෂය පථයට ප්‍රවේශ විය නොහැක.

PHP අත්පොතෙහි ක්‍රමයක හෝ විචල්‍යයේ දෘශ්‍යතාව කියවන්න .


9

' කවදාද ' යන්න සලකා බැලීම :
මට හරියටම විශ්වාස නැතිනම් මුලදී සියල්ල පුද්ගලික යැයි ප්‍රකාශ කිරීමට මම නැඹුරු වෙමි. හේතුව, සාමාන්‍යයෙන් වෙනත් ක්‍රමයක් හැර පෞද්ගලික ක්‍රමයක් ප්‍රසිද්ධ කිරීම පහසුය. එයට හේතුව පුද්ගලික ක්‍රමය කොතැනකවත් භාවිතා කර නැති නමුත් පන්තියේම බව ඔබට අවම වශයෙන් සහතික විය හැකි බැවිනි. පොදු ක්‍රමයක් දැනටමත් සෑම තැනකම භාවිතයේ තිබිය හැකි අතර, පුළුල් ලෙස නැවත ලිවීම අවශ්‍ය විය හැකිය.

යාවත්කාලීන කිරීම : protectedමම මේ දිනවල පෙරනිමියකට යන්නෙමි , මන්දයත් එය වටකර ගැනීම සඳහා ප්‍රමාණවත් බවත් මම පන්ති දීර් ing කරන විට එය මඟ නොහරින බවත් මම සොයාගෙන ඇත (මම කෙසේ හෝ වළක්වා ගැනීමට උත්සාහ කරමි). අනෙක් දෙක භාවිතා කිරීමට මට හොඳ හේතුවක් තිබේ නම් පමණක් මම එසේ කරමි.

privateක්‍රමවේදයක් සඳහා හොඳ හේතුවක් වනුයේ එම වස්තුවට ආවේනික යමක් ක්‍රියාත්මක වන අතර එය විස්තාරණය වන පන්තියක් පවා වෙනස් නොවිය යුතුය (සත්‍ය හේතුව, සංසරණයට අමතරව අභ්‍යන්තර රාජ්‍ය කළමනාකරණය වැනි). අවසානයේදී, protectedසාමාන්‍යයෙන් ක්‍රමයක් භාවිතා කරන්නේ කොතැනදැයි සොයා ගැනීමට තවමත් පහසුය , එබැවින් මම protectedමේ දිනවල පෙරනිමිය . සමහර විට 100% වෛෂයික "අගල් වල" අත්දැකීම් නොවන බව මම පිළිගනිමි.


3
ඔබගේ යාවත්කාලීනය සමඟ: “ප්‍රමාණවත් තරම්” සහ “හොඳ හේතුව” මෙහි එකට යන්නේ කෙසේද යන්න ඔබට වඩාත් පැහැදිලි කළ හැකිද? නිදසුනක් ලෙස, භාවිතා privateකිරීම තවමත් භාවිතා කිරීමට “හොඳ” වනු ඇත, නමුත් ඔබ කලින් ලබා දුන් හේතු තවමත් “හොඳ හේතුවක්” ලෙස පෙනෙන්නට ඇතැයි ඔබ යෝජනා නොකරයි: සංසරණය.
hakre

khakre: අප සංසරණය සඳහා උත්සාහ කළ යුතු හේතුව වන්නේ බාහිර විෂය පථයට තත්වය කාන්දු වීම වළක්වා ගැනීමයි. protectedඑය දැනටමත් සිදු කරයි, නමුත් ඔබ එය දිගු කිරීම / උරුමය සඳහා නම්යශීලී ලෙස තබා ගනී. නැවතත්, ඔබට එය සෑදීමට හොඳ හේතුවක් නොමැති නම් private.
ඩෑන්මන්

හොඳයි, බොහෝ විට අප එකඟ නොවන කාරණය මෙයයි: protectedඇත්ත වශයෙන්ම බාහිර විෂය පථයට කාන්දු වන අතර එය බොහෝ විට ඔබේ මාර්ගයට අනුව එය ව්‍යංගයෙන් උරුමයට අනුග්‍රහය දැක්වීම වැනි නරක නිර්මාණ තීරණ වලට සහාය වන අතර සංයුතියට අනුග්‍රහය දැක්වීම වඩා හොඳය. කේත ලිවීම ආරම්භ කිරීමට වඩා හොඳ ක්‍රමයක් වන්නේ ඔබට අවශ්‍ය නොවන සැබෑ අවශ්‍යතා මිස පෞද්ගලිකව රැඳී සිටීමයි. මෙය සැබවින්ම අවශ්‍ය නොවන අතර කල්තියා සැලසුම් තීරණ ගැනීම වළක්වනු ඇත.
හක්රේ

ඔබගේ සමස්ත කාරණය සමඟ මම තර්ක නොකරමි, මන්ද එය ප්‍රමාණවත් තරම් සාධාරණ නමුත් බාහිර විෂය පථයට protectedකාන්දු නොවන (ක්‍රමයට / ක්ෂේත්‍රයට ඇමතුම් / ප්‍රවේශ වන කේතය) නොව අභ්‍යන්තර විෂය පථය (පන්ති පුළුල් කිරීම) පමණි. ඔබට ඇති තරම් සුළු වෙනසක් ඇත. එක් ක්ෂේත්‍රයකට වඩා ක්ෂේත්‍රයක භාවිතය සොයා ගැනීම පහසුය . protectedpublic
ඩෑන්මන්

6

PHP අත්පොතෙහි හොඳ කියවීමක් ඇත මෙහි ඇත.

පොදු, ආරක්‍ෂිත හෝ පෞද්ගලික යන වචන සමඟ ප්‍රකාශය උපසර්ග කිරීමෙන් දේපලක හෝ ක්‍රමයක දෘශ්‍යතාව අර්ථ දැක්විය හැකිය. පංති සාමාජිකයින්ට ප්‍රකාශ කළ පරිදි සෑම තැනකටම මහජනතාවට ප්‍රවේශ විය හැකිය. ආරක්ෂිත යැයි ප්‍රකාශ කරන සාමාජිකයින්ට ප්‍රවේශ විය හැක්කේ පන්තිය තුළම සහ උරුම සහ මව් පංති වලට පමණි. පුද්ගලික යැයි ප්‍රකාශ කරන සාමාජිකයින්ට ප්‍රවේශ විය හැක්කේ සාමාජිකයා නිර්වචනය කරන පන්තියට පමණි.


6

මට නම්, දේපල වර්ග තුන තේරුම් ගැනීමට වඩාත්ම ප්‍රයෝජනවත් ක්‍රමය මෙයයි:

පොදු : මෙම විචල්‍යය ඔබේ කේතයේ ඕනෑම තැනක සිට කෙලින්ම ප්‍රවේශ වී වෙනස් කර ඇති විට ඔබ හොඳින් සිටින විට මෙය භාවිතා කරන්න.

පංතියෙන් පිටත සිට උදාහරණ භාවිතය:

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

ආරක්ෂිතයි : විචල්‍යයන්ට ප්‍රවේශ වන විට සහ සැකසීමේදී වෙනත් ක්‍රමලේඛකයන්ට (සහ ඔබටම) පන්තියෙන් පිටත සිටින අය / සෙටර් භාවිතා කිරීමට බල කිරීමට අවශ්‍ය විට මෙය භාවිතා කරන්න (නමුත් ඔබ ස්ථාවර විය යුතු අතර පංතිය තුළ සිටින අය සහ කට්ටලද භාවිතා කරන්න). මෙය හෝ privateඔබ සියලු පන්ති ගුණාංග සැකසිය යුතු සුපුරුදු ක්‍රමය වේ.

මන්ද? මක්නිසාද යත්, අනාගතයේ යම් අවස්ථාවක දී (සමහර විට මිනිත්තු 5 ක් වැනි) ඔබට එම දේපල සඳහා ආපසු ලබා දී ඇති වටිනාකම හැසිරවීමට හෝ ලබා ගැනීමට / සැකසීමට පෙර ඒ සමඟ යමක් කිරීමට අවශ්‍ය යැයි ඔබ තීරණය කරන්නේ නම්, ඔබට ඇති සෑම තැනකම ප්‍රතිනිර්මාණය නොකර එය කළ හැකිය. එය ඔබේ ව්‍යාපෘතියේ භාවිතා කර ඇත.

පංතියෙන් පිටත සිට උදාහරණ භාවිතය:

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

පුද්ගලික : privateදේපල දේපල වලට බෙහෙවින් සමාන ය protected. නමුත් කැපී පෙනෙන ලක්ෂණය / වෙනස නම්, එය සෑදීමෙන් privateමව් පංතියේ ගේටරය හෝ සෙටරය භාවිතා නොකර ළමා පන්තිවලට ප්‍රවේශ විය නොහැකි වීමයි.

එබැවින් මූලික වශයෙන්, ඔබ දේපලක් සඳහා ලබා ගන්නන් සහ සැකසුම් භාවිතා කරන්නේ නම් (හෝ එය මව් පංතිය විසින් අභ්‍යන්තරව පමණක් භාවිතා කරනු ලබන අතර එය වෙනත් තැනකට ප්‍රවේශ විය යුතු යැයි අදහස් නොකෙරේ නම්) privateකිසිවෙකු උත්සාහ කිරීමෙන් වලක්වා ගැනීම සඳහා ඔබටත් එය කළ හැකිය. එය කෙලින්ම භාවිතා කිරීමට සහ දෝෂ හඳුන්වා දීමට .

ළමා පන්තියක් තුළ උදාහරණ භාවිතය (එය MyObject දිගු කරයි):

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


4

PHP හි විචල්‍යයන් විවිධ වර්ග තුනකට දමනු ලැබේ:

පොදු: මෙම විචල්‍ය වර්ගවල අගයන් සෑම විෂය පථයකින්ම ලබා ගත හැකි අතර ඔබේ කේතය ක්‍රියාත්මක කිරීමට කැඳවුම් කරන්න. මෙසේ ප්‍රකාශ කරන්න:public $examTimeTable;

පුද්ගලික: මෙම වර්ගයේ විචල්‍යයේ අගයන් ලබා ගත හැක්කේ එය අයත් පන්තියට පමණි. private $classRoomComputers;

ආරක්ෂිතයි: මෙම පංතියේ වටිනාකම් පමණක් ලබා ගත හැකි අතර උරුමයක් ලෙස හෝ ඔවුන්ගේ ළමා පන්තියට ප්‍රවේශය ලබා දුන් විට පමණි. සාමාන්‍යයෙන් ::මව් පංතියෙන් ප්‍රවේශය ලබා දීමට භාවිතා කරයි

protected $familyWealth;


4

පැරණි ප්‍රශ්නයක් පුනර්ජීවනය කිරීම, නමුත් මම හිතන්නේ මෙය සිතීමට හොඳ ක්‍රමයක් වන්නේ ඔබ නිර්වචනය කරන API අනුව ය.

  • public - පොදු ලෙස සලකුණු කරන සෑම දෙයක්ම ඔබගේ පන්තිය / අතුරුමුහුණත / වෙනත් භාවිතා කරන ඕනෑම අයෙකු භාවිතා කරන සහ විශ්වාස කරන API හි කොටසකි.

  • protected- රැවටෙන්න එපා, මෙයද API හි කොටසකි! පුද්ගලයන්ට උප පංතිය, ඔබේ කේතය දිගු කිරීම සහ ආරක්ෂිත ලෙස සලකුණු කර ඇති ඕනෑම දෙයක් භාවිතා කළ හැකිය.

  • private- පුද්ගලික දේපල සහ ක්‍රම ඔබ කැමති තරම් වෙනස් කළ හැකිය. වෙනත් කිසිවෙකුට මේවා භාවිතා කළ නොහැක. බිඳීමේ වෙනස්කම් නොකර ඔබට වෙනස් කළ හැකි එකම දේ මේවාය.

හෝ සෙම්වර් වචන වලින්:

  • ඕනෑම දෙයක වෙනස්වීම් publicහෝ ප්‍රධාන protectedවෙනස්කම් ලෙස සැලකිය යුතුය.

  • අළුත් දෙයක් publicහෝ protectedඅවම වශයෙන් (අවම වශයෙන්) MINOR විය යුතුය

  • privatePATCH විය හැක්කේ ඕනෑම දෙයකට නව / වෙනස්කම් පමණි

එබැවින් කේතය නඩත්තු කිරීමේදී, ඔබ සාදන දේ ගැන සැලකිලිමත් වීම හොඳය, publicනැතහොත් protectedමේවා ඔබේ පරිශීලකයින්ට පොරොන්දු වන කරුණු වේ.


1

අපගේ ව්‍යාපෘතියේ වස්තු දිශානත php අනුගමනය කරන විට, අපි php හි ප්‍රවේශ විකරණකාරක භාවිතා කිරීමට නීති කිහිපයක් අනුගමනය කළ යුතුය. අද අපි ප්‍රවේශ විකරණකාරකය යනු කුමක්ද සහ එය භාවිතා කරන්නේ කෙසේද යන්න පැහැදිලිව ඉගෙන ගැනීමට අපි බලාපොරොත්තු වෙමු. Php හි පන්ති සාමාජිකයින් සඳහා විෂය පථ තුනක් ඇත.

  1. පොදු
  2. පුද්ගලික
  3. ආරක්ෂිතයි

දැන්, ප්‍රවේශ විකරණකාරක ප්‍රවේශ මට්ටම අවබෝධ කර ගැනීම සඳහා පහත රූපය දෙස බලමු රූප විස්තරය මෙහි ඇතුළත් කරන්න

දැන්, ප්‍රවේශ විකරණකාරක ලෙස භාවිතා කළ හැකි PHP මූල පද ගැන දැන ගැනීමට පහත ලැයිස්තුව දෙස බලමු.

පොදු: - මෙම ප්‍රවේශ විකරණකාරකය සමඟ අර්ථ දක්වා ඇති පන්තියට හෝ එහි සාමාජිකයින්ට පන්තියේ විෂය පථයෙන් පිටත සිට පවා ඕනෑම තැනක සිට ප්‍රසිද්ධියේ ප්‍රවේශ විය හැකිය.

පුද්ගලික: - මෙම මූල පදය සහිත පන්ති සාමාජිකයින්ට පන්තිය තුළම ප්‍රවේශ වේ. අපට උප පංතියෙන් පුද්ගලික දත්ත වෙත පිවිසිය නොහැක. එය බාහිර පන්ති ප්‍රවේශයෙන් සාමාජිකයන් ආරක්ෂා කරයි.

ආරක්ෂිත: - ආරක්ෂිත සුපිරි පන්තියේ සාමාජිකයින්ට ප්‍රවේශ වීමට උප පංතිවලට ඉඩ දීම හැර, පුද්ගලික හා සමාන ය.

දැන් ප්‍රවේශ විකරණකාරකය තේරුම් ගැනීමට වගුව බලන්න සම්පූර්ණ ලිපිය කියවන්න php access modifire


1

Public: ඔබ විචල්‍යයක් හෝ ක්‍රමයක් ප්‍රකාශ කරන විට පෙරනිමි තත්වයකි, ඕනෑම දෙයකට කෙලින්ම වස්තුවට ප්‍රවේශ විය හැකිය.

Protected: ප්‍රවේශ විය හැක්කේ වස්තුව සහ උප පංති තුළ පමණි.

Private: යොමු කළ හැක්කේ උප කාණ්ඩවලට නොව වස්තුව තුළ පමණි.


0

සඳහන් කළ මූල පද ප්‍රවේශ විකරණකාරක වන අතර එන්කැප්සුලේෂන් (හෝ තොරතුරු සැඟවීම) ක්‍රියාත්මක කිරීමට අපට උපකාරී වේ. ඔවුන් සම්පාදකයාට පවසන්නේ වෙනත් පංතිවලට ක්ෂේත්‍රයට හෝ ක්‍රමයට ප්‍රවේශය තිබිය යුතු බවයි.

private - ක්ෂේත්‍රයට හෝ ක්‍රමයට ප්‍රවේශය ඇත්තේ වත්මන් පන්තියට පමණි.

ආරක්ෂිතයි - මෙම පන්තියේ වත්මන් පංතිය සහ උප පංති (සහ සමහර විට එකම පැකේජ පන්ති) පමණක් ක්ෂේත්‍රයට හෝ ක්‍රමයට ප්‍රවේශය ඇත.

පොදු - ඕනෑම පන්තියකට ක්ෂේත්‍රය වෙත යොමු වීමට හෝ ක්‍රමය අමතන්න.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.