Genel, özel ve korumalı arasındaki fark nedir?


988

Ve neden ne zaman kullanmalıyım public, privateve protectedbir sınıf içerisindeki fonksiyonları ve değişkenleri? Onların arasındaki fark ne?

Örnekler:

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

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

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

59
Bu sorunun, her bir anahtar kelimenin ne yaptığının gerçek tanımını sağlamak yerine, her birinin kullanımıyla ilgili pratik örneklere sahip yanıtlardan da fayda sağlayacağını düşünüyorum.
Matthew

70
Gerçekten bu sorunun korunmalı değil, herkese açık olması gerektiğini düşünüyorum.
16:42 de dotancohen

Yanıtlar:


1260

Kullan:

  • public o özelliği / yöntemi her yerden, nesnenin diğer sınıflarından ve örneklerinden kullanılabilir hale getirme kapsamı.

  • private özelliğinizin / yönteminizin yalnızca kendi sınıfında görünmesini istediğinizde.

  • protected üst sınıf da dahil olmak üzere geçerli sınıfı genişleten tüm sınıflarda özellik / yönteminizi görünür yapmak istediğiniz kapsam.

Daha fazla bilgi : (Kapsamlı bilgi için)


79
protecteddeğişkeninizi / işlevinizi geçerli sınıfı VE üst sınıflarını genişleten tüm sınıflarda görünür kılmak istediğinizde kapsam .
Shahid

4
@Shahid - Ne demek istediğini anlamıyorum. A sınıfını genişleten herhangi bir sınıf A'nın ana sınıfını da genişletir, değil mi?
JDelage

4
@JDelage - Lütfen bağlantıya bakınızhttp://www.php.net/manual/en/language.oop5.visibility.php#109324
Shahid

4
@Growler O zaman neden nesneler kullanmaktan rahatsız oluyorsunuz?
J.Steve

27
@Growler, daha yararlı bir cevap, bir nesnenin iç işleyişini olabildiğince gizlemenin iyi olmasıdır. Bu şekilde kırılma olasılığı daha düşüktür. Her şeyi herkese açık hale getirirseniz, başka bir programcı nesnenizin iç işleyişinden başka bir şey tarafından değiştirilmesini istemediğiniz bir değişkeni değiştirebilir.
Kıbrıs'ta Rahatlama

1176

gg

Halka açık:

Bir yöntemi (işlevi) veya özelliği (değişkeni) olarak bildirdiğinizde public, bu yöntemlere ve özelliklere şu yollarla erişilebilir:

  • Bunu ilan edenle aynı sınıf.
  • Yukarıda belirtilen sınıfı devralan sınıflar.
  • Bu sınıfın dışındaki yabancı unsurlar da bunlara erişebilir.

Misal:

<?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'

Korumalı:

Bir yöntemi (işlevi) veya bir özelliği (değişkeni) olarak bildirdiğinizde protected, bu yöntemlere ve özelliklere

  • Bunu ilan edenle aynı sınıf.
  • Yukarıda belirtilen sınıfı devralan sınıflar.

Yabancı üyeler bu değişkenlere erişemez. Beyan edilen sınıfın kendisinin nesne örnekleri olmamaları anlamında "yabancılar" .

Misal:

<?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

Kesin hata şu olacaktır:

PHP Önemli hata: Korumalı mülke erişilemiyor GrandPa :: $ name


Özel:

Bir yöntemi (işlevi) veya özelliği (değişkeni) olarak bildirdiğinizde private, bu yöntemlere ve özelliklere şu yollarla erişilebilir:

  • Bunu ilan edenle aynı sınıf.

Yabancı üyeler bu değişkenlere erişemez. Yabancıların beyan edilen sınıfın kendisinin ve hatta beyan edilen sınıfı miras alan sınıfların nesne örnekleri olmamaları anlamındadır .

Misal:

<?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

Kesin hata mesajları şöyle olacaktır:

Uyarı: Tanımsız özellik: Daddy :: $ name
Önemli hata: Özel mülke erişilemiyor GrandPa :: $ name


Yansıma Kullanarak Büyükbaba Sınıfını Kesme

Bu konu gerçekten kapsam dışı değil ve buraya sadece yansımanın gerçekten güçlü olduğunu kanıtlamak için ekliyorum. Yukarıdaki üç örnekte belirttiğim gibi, protectedveprivate elemanlar (özellikler ve yöntemler) sınıfının dışında erişilemez.

Ancak, yansıma ile yapabileceğiniz olağanüstü bile erişerek protectedveprivate sınıfının üyeleri dışında!

Ya yansıma nedir?

Yansıma sınıfları, arabirimleri, işlevleri, yöntemleri ve uzantıları tersine mühendislik becerisi ekler. Ayrıca, işlevler, sınıflar ve yöntemler için doktor yorumlarını almanın yollarını sunarlar.

önsöz

Adında bir sınıfımız var Grandpasve üç özelliğimiz olduğunu söylüyor. Kolay anlaşılması için, isimleri olan üç büyükbaba olduğunu düşünün:

  • Mark Henry
  • John Clash
  • Will Jones

Bize bunları (atama değiştiriciler) yapalım public, protectedve privatesırasıyla. Çok iyi biliyorsunuz protectedve privateüyelere sınıf dışında erişilemiyor. Şimdi ifade kullanarak yansıma ile çelişelim.

Kod

<?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>";
}

Çıktı:

#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

Yaygın yanlış anlamalar:

Lütfen aşağıdaki örnekle karıştırmayın. Hala görebileceğiniz gibi, privateve protectedüyelerine yansıma kullanmadan sınıfın dışında erişilemiyor

<?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);

Çıktı:

GrandPas Object
(
    [name1] => Mark Henry
    [name2:protected] => John Clash
    [name3:GrandPas:private] => Will Jones
)

Hata ayıklama işlevleri

print_r, var_exportVe var_dumpvardır ayıklayıcı fonksiyonları . Bir değişken hakkında insan tarafından okunabilir biçimde bilgi verirler. Bu üç fonksiyon gösterecek protectedve privatePHP 5. Statik sınıf üyeleri ile nesnelerin özellikleri olacak değil gösterilir.


Daha fazla kaynak:



geç için özür dilerim bu konvoya ekleyin. Birinin bunları neden kullanacağını söyleyebilir misiniz? Nasıl çalıştıklarını mükemmel bir şekilde açıkladınız .. Sadece bunların her birinin kullanımının faydalarını bilmek istiyorum. Teşekkür ederim
JamesG

@JamesG yukarıdaki diğer yorumda biraz açıkladı. stackoverflow.com/questions/4361553/…
58'de sarsılmak

Neden belki bu sorunun biraz dışında bilmiyorum ama kimse PHP başka bir iki erişim değiştiricileri olduğunu söyledi: soyut ve son bu anahtar kelime sadece PHP sınıfları için kullanılabilir ama yine de değiştiricileri erişim
bxN5

1
Dhairya Lakhera tarafından sağlanan soyutlama ile ilgili açıklamayı burada okumanızı öneririm: stackoverflow.com/questions/2558559/… . Shankar Damodaran açıklamalarına mükemmel bir ektir.
Julio Marchi

83

Veri kapsüllemesini ve iyi arayüz tasarımını teşvik ettiğinden, tipik olarak gereken en düşük görünürlüğü varsayılan olarak uygulamak iyi bir uygulamadır. Üye değişkeni ve yöntem görünürlüğü göz önüne alındığında, üyenin diğer nesnelerle etkileşimde oynadığı rolü düşünün.

"Uygulama yerine bir arayüze kod yazarsanız", görünürlük kararları vermek oldukça kolaydır. Genel olarak, değişkenleri ifşa etmek için iyi bir nedeniniz yoksa özel veya korunmuş olmalıdır. Bir sınıfın içindeki kişilere erişimi sınırlamak ve düzenlemek için genel erişimciler (alıcılar / ayarlayıcılar) kullanın.

Bir arabayı bir benzetme olarak kullanmak için hız, vites ve yön gibi şeyler özel durum değişkenleri olacaktır. Sürücünün hava / yakıt oranı gibi şeyleri doğrudan değiştirmesini istemezsiniz. Bunun yerine, genel yöntemler olarak sınırlı sayıda eylemi ortaya koyarsınız. Bir arabaya arayüz yöntemleri gibi içerebilir accelerate(), deccelerate()/ brake(), setGear(), turnLeft(), turnRight(), vb

Sürücü, bu eylemlerin otomobilin iç kısımları tarafından nasıl uygulandığını bilmiyor ya da bilmiyor ve işlevselliğin sürücü ve yoldaki diğer kişiler için tehlikeli olabileceğini ortaya koyuyor. Bu nedenle, halka açık bir arayüz tasarlama ve bu arayüzün arkasındaki verileri kapsülleme konusunda iyi uygulama.

Bu yaklaşım, arabirimin istemci koduyla olan sözleşmesini bozmadan sınıfınızdaki genel yöntemlerin uygulanmasını değiştirmenize ve geliştirmenize de olanak tanır. Örneğin, accelerate()yöntemi yakıt açısından daha verimli olacak şekilde geliştirebilirsiniz, ancak bu yöntemin kullanımı aynı kalır; müşteri kodu hiçbir değişiklik gerektirmez, ancak yine de verimlilik artırmanızın avantajlarından yararlanabilirsiniz.

Düzenleme: Eğer (çok daha zor herhangi bir dilde sözdizimi daha usta olan) nesne yönelimli kavramları öğrenme ortasında hala görünüyor beri, son derece bir kopyasını alıp tavsiye ve Uygulama PHP Nesneler, Patterns Matt Zandstra tarafından. Bu bana sadece sözdizimini öğretmek yerine OOP'u nasıl etkili bir şekilde kullanacağımı öğreten kitap . Sözdizimini yıllar önce öğrenmiştim, ancak OOP'un "nedenini" anlamadan işe yaramazdı.


3
Bu yazının düzenlenmesinde önerilen kitap gerçekten çok mükemmel. Şimdiye kadar kullandığım yığın oldukça aydınlatıcı oldu. İlk birkaç bölüm dersle ilgili sorularımın çoğunu yanıtladı.
Josiah

Smalltalk'taki örnekler gibi gereksiz detaylarla düşüncelerimi dışarıda bırakmadan nesneleri gerçekten anlamama izin veren kitaplar, Nesne Odaklı Teknoloji: Nesne Teechnology ile bir Yönetici Kılavuzu ve İşletme Mühendisliği olan David A Taylor tarafından yazılmıştır . Her ikisi de sadece 100 sayfa ve her biri bir öğleden sonra okumak için yeterince kolay. Tabii ki, Gamma ve arkadaşlarının Tasarım Kalıpları var , ancak temel yaklaşım basitçe 'değiştirmek istediğiniz alt sınıf' ile tanımlanabilir.
Patanjali

Çok güzel bir benzetme. Korumalı vs özel için bir tane var mı?
Jānis Elmeris

79

private - sadece ININ sınıfından erişilebilir

protected - WITHIN sınıfından ve INHERITING sınıflarından erişilebilir

public - Sınıf DIŞINDA koddan da erişilebilir

Bu, fonksiyonların yanı sıra değişkenler için de geçerlidir.


Korumalı tanımın burada doğru olup olmadığından emin değilim, seçilen gerçek yanıttan, Korumalı - Orijinal / üst sınıftan değil, yalnızca miras alınan sınıftan erişilebilir. "Sınıfın içinde" demek biraz kafa karıştırıcı olabilir.
pal4life

7
Ben öyle düşünmüyorum, aslında seçilen cevabın burada kafa karıştırıcı olduğu anlaşılıyor. Şahidlerin yorumuna bakınız. IMHO korumalı bir yönteme orijinal sınıf içinden çok iyi erişilebilir.
Olaf

Bir sınıf başka bir sınıfın halkına erişebilir mi?
Serjas

1
@Serjas: Hayır, statik yöntemler / alanlar olmadıkça yalnızca başka bir nesnenin.
DanMan

Bu tüm programlama dilleri için geçerli olup olmadığını bilmiyorum, ama PHP "korumalı" özellikleri / yöntemleri bildirildi sınıf veya özellik / yöntem tanımlayan sınıftan devralan sınıflar erişilebilir.
John Slegers

25

Fark aşağıdaki gibidir:

Public :: Ortak bir değişkene veya yönteme sınıfın herhangi bir kullanıcısı tarafından doğrudan erişilebilir.

Protected :: Korumalı bir değişkene veya yönteme sınıf kullanıcıları tarafından erişilemez, ancak sınıftan devralan bir alt sınıfın içinden erişilebilir.

Private :: Özel bir değişkene veya yönteme yalnızca içinde tanımlandığı sınıftan erişilebilir.Bu, özel bir değişkenin veya yöntemin sınıfı genişleten bir alt öğeden çağrılamayacağı anlamına gelir.


17

Görünürlük Kapsamları ile Soyut Örnekler :: kolay Anlayışı yapar

Bir mülkün veya yöntemin bu görünürlüğü, üç anahtar kelimeden birinin (Genel, korumalı ve özel) önceden bildirilmesi ile tanımlanır

halka açık : Bir özellik veya yöntem genel olarak tanımlanırsa, nesneye başvurabilecek herhangi bir şey tarafından hem erişilebileceği hem de değiştirilebileceği anlamına gelir.

  • Özet örn. Genel görünürlük kapsamını "genel piknik" olarak düşünün herkesin gelebileceği .

Korumalı: bir özellik veya yöntem görünürlüğü korumalı üyelere ayarlandığında, yalnızca sınıfın kendisinde ve devralınan ve devralınan sınıflarla erişilebilir. (Miras alınan: - bir sınıf, başka bir sınıfın tüm özelliklerine ve yöntemlerine sahip olabilir).

  • Korunan bir görünürlük kapsamı olarak , şirket üyelerinin ve aile üyelerinin kamuya açık olmasına izin verilen "Şirket pikniği" olarak düşünün . En yaygın kapsam kısıtlamasıdır.

Özel: Bir özellik veya yöntem görünürlüğü özel olarak ayarlandığında, belki de sınıf ilişkisi ne olursa olsun, yalnızca özel üyelere sahip olan sınıf bu yöntemlere ve özelliklere (Dahili olarak sınıf içinde) erişebilir.

  • piknik benzetmesi ile piknikte "sadece şirket üyelerinin izin verildiği şirket pikniği" olarak düşünün . ailenin genel halkına izin verilmez.

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

Alıntı:

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


12

⚡️ İşte kapsamını hatırlamak için kolay bir yoldur public, protectedve private.

PUBLIC:

  • public scope: Ortak değişken / işlev hem nesneler hem de diğer sınıflar için kullanılabilir.

PROTECTED:

  • protected scope: Geçerli sınıfı genişleten tüm sınıflar için korumalı bir değişken / işlev kullanılabilir.
  • Hayır! Nesneler bu kapsama erişemiyor

PRIVATE:

  • private scope: Özel bir değişken / işlev yalnızca tanımlandığı geçerli sınıfta görünür.
  • Hayır! Geçerli sınıfı genişleten sınıf bu kapsama erişemez.
  • Hayır! Nesneler bu kapsama erişemiyor.

PHP Manual'da bir yöntemin veya değişkenin Görünürlüğünü okuyun .


9

' Ne zaman ' dikkate alındığında :
Tam olarak emin değilseniz, başlangıçta her şeyi özel olarak ilan etme eğilimindeyim. Bunun nedeni, özel bir yöntemi herkese açık hale getirmenin genellikle diğer yönden çok daha kolay olmasıdır. Çünkü en azından özel yöntemin sınıfın kendisinde değil, hiçbir yerde kullanılmadığından emin olabilirsiniz. Herkese açık bir yöntem zaten her yerde kullanımda olabilir ve muhtemelen kapsamlı bir yeniden yazma gerektirebilir.

Güncelleme : protectedBugünlerde bir varsayılan için gidiyorum , çünkü kapsülleme için yeterince iyi olduğunu ve sınıfları genişletirken (ki yine de kaçınmaya çalışıyorum) yolumda olmadığını bulmak için geldim. Sadece diğer ikisini kullanmak için iyi bir nedenim varsa, yapacağım.

Bir privateyöntemin iyi bir nedeni, genişleyen bir sınıfın bile değişmemesi gereken o nesnenin doğasında olan bir şeyi uygulayan bir yöntem olabilir (iç durum yönetimi gibi kapsüllemeye ek olarak olgusal neden). Sonunda, protectedgenellikle bir yöntemin genellikle nerede kullanıldığını izlemek için yeterince kolay , bu yüzden protectedbugünlerde varsayılan . Belki% 100 objektif değil "siperlerde" deneyim, itiraf ediyorum.


3
Güncellemenizle: "Yeterince iyi" ve "iyi neden" in burada nasıl bir araya geldiklerini daha net anlatabilir misiniz? Örneğin, kullanmak privatehala kullanmak için "yeterince iyi" olurdu , ancak daha önceki nedenlerden dolayı "iyi bir neden" gibi hala ses vermiş olmanızı önermiyorsunuz: kapsülleme.
hakre

@hakre: Kapsülleme için çabalamamızın sebebi, durumun dış kapsama sızmasını önlemektir. protectedbunu zaten yapar, ancak uzantı / kalıtım için esnek tutarsınız. Yine, bunu yapmak için iyi bir nedeniniz yoksa private.
DanMan

Muhtemelen katılmadığımız nokta budur: protectedaslında dış kapsama sızar ve kompozisyonu tercih etmek daha iyi olurken dolaylı olarak mirasın tercih edilmesi gibi kötü tasarım kararlarını desteklediği için genellikle yolunuzdadır. Bu nedenle, gerçek gereksinimleriniz yoksa özel olarak sadık kalmak, kod yazmaya başlamak için genellikle daha iyi bir yoldur. Bu aynı zamanda tasarım kararlarının çok erken yapılmasını ve henüz gerekli olmadıklarını da önleyecektir.
hakre

Çünkü 's adil yeterli, genel noktasıyla tartışmayacağım, ama protectediçine su almaması dış kapsam ancak (sınıflar uzanan) sadece iç kapsamını (/ çağırma yöntemi / alan giriş yapıyor kodu). Sizin için olabildiğince küçük bir fark var. Bir protectedalanın kullanımını bir alandan izlemek çok daha kolaydır public.
DanMan

6

PHP el kitabı burada soru iyi bir okuma var .

Bir mülkün veya yöntemin görünürlüğü, bildirime genel, korumalı veya özel anahtar kelimelerle ön ek verilerek tanımlanabilir. Herkese açık ilan edilen sınıf üyelerine her yerden erişilebilir. Korumalı olduğu bildirilen üyelere yalnızca sınıfın kendisinde, devralınan ve üst sınıflar tarafından erişilebilir. Özel olarak beyan edilen üyelere yalnızca üyeyi tanımlayan sınıf tarafından erişilebilir.


6

Benim için bu en faydalı için bu üç özellik türünü anlamanın yolu:

halka açık : Tamam olduğunuzda, bu değişkene doğrudan kodunuzdaki herhangi bir yerden erişilir ve değiştirilir.

Sınıf dışından örnek kullanım:

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

Korumalı : Değişkenlere erişip ayarlarken diğer programcıları (ve kendinizi) sınıfın dışındaki alıcıları / ayarlayıcıları kullanmaya zorlamak istediğinizde bunu kullanın (ancak tutarlı olmanız ve sınıf içindeki alıcıları ve ayarlayıcıları da kullanmanız gerekir). Bu veya privatetüm sınıf özelliklerini ayarlamanız gereken varsayılan yöntem olma eğilimindedir.

Neden? Çünkü gelecekte bir noktada (belki 5 dakika içinde bile olsa) o özellik için döndürülen değeri değiştirmek veya almadan / ayarlamadan önce bir şey yapmak istediğinize karar verirseniz, bunu her yerde yeniden düzenleme yapmadan yapabilirsiniz projenizde kullandınız.

Sınıf dışından örnek kullanım:

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

Özel : privateözellikler özelliklere çok benzer protected. Ancak ayırt edici özellik / fark,private ana sınıfın alıcısını veya ayarlayıcısını kullanmadan çocuk sınıfları için erişilemez hale getirmesidir.

Temel olarak, bir mülk için alıcılar ve ayarlayıcılar kullanıyorsanız (veya yalnızca üst sınıf tarafından dahili olarak kullanılıyorsa ve başka bir yerde erişilebilir olması amaçlanmamışsa) private, bunu herkesin denemesini önlemek için de yapabilirsiniz. doğrudan kullanmak ve hataları tanıtmak için .

Bir alt sınıfta örnek kullanım (MyObject'i genişleten):

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


4

PHP'deki değişkenler üç farklı türde kullanılır:

Genel: Bu değişken türlerinin değerleri tüm kapsamda mevcuttur ve kodunuzun yürütülmesini gerektirir. olarak ilan et:public $examTimeTable;

Özel: Bu değişken türünün değerleri yalnızca ait olduğu sınıf için geçerlidir. private $classRoomComputers;

Korumalı: Yalnızca bu sınıfın değerleri ve yalnızca Access'e bir miras veya alt sınıf olarak verildiğinde kullanılabilir. genellikle ::ebeveyn sınıfına erişim vermek için kullanılır

protected $familyWealth;


3

Eski bir soruyu canlandırmak, ancak bunu düşünmenin gerçekten iyi bir yolunun tanımladığınız API açısından olduğunu düşünüyorum.

  • public - Herkese açık olarak işaretlenen her şey, sınıfınızı / arayüzünüzü / diğerlerini kullanan herkesin kullanacağı ve güveneceği API'nın bir parçasıdır.

  • protected- Kanmayın, bu aynı zamanda API'nın bir parçası! Kişiler alt sınıfı sınıflandırabilir, kodunuzu genişletebilir ve korumalı olarak işaretlenmiş herhangi bir şeyi kullanabilir.

  • private- Özel mülkler ve yöntemler istediğiniz kadar değiştirilebilir. Başka hiç kimse bunları kullanamaz. Son dakika değişiklikleri yapmadan değiştirebileceğiniz tek şey bunlar.

Veya Semver terimleriyle:

  • Herhangi bir değişiklik publicveya protectedönemli değişiklikler kabul edilmelidir.

  • Yeni olan publicveya protecteden az MINOR olmalıdır

  • Yalnızca yeni / herhangi bir şeyde yapılan değişiklikler privatePATCH olabilir

Bu nedenle, kodun korunması açısından, ne yaptığınıza publicveya protectedbunlar kullanıcılarınıza vaat ettiğiniz şeyler olduğuna dikkat etmek iyidir .


1

Projemizde nesne yönelimli php'yi takip ettiğimizde, php'de erişim değiştiricileri kullanmak için bazı kurallara uymalıyız. Bugün erişim değiştiricinin ne olduğunu ve nasıl kullanabileceğimizi net bir şekilde öğreneceğiz.PHP erişim değiştiricileri, PHP sınıfları ve sınıf kapsamında tanımlanan işlevler ve değişkenler olan üyeleriyle erişim haklarını ayarlamak için kullanılır. Php sınıf üyeleri için üç kapsamı vardır.

  1. HALKA AÇIK
  2. ÖZEL
  3. KORUMALI

Şimdi, erişim değiştirici erişim seviyesini anlamak için aşağıdaki resme bir göz atalım resim açıklamasını buraya girin

Şimdi, erişim değiştiricileri olarak kullanılan olası PHP anahtar kelimeleri hakkında bilgi edinmek için aşağıdaki listeye bir göz atalım.

public: - class veya bu erişim değiştiriciyle tanımlanan üyelerine, sınıfın kapsamı dışında bile olsa her yerden herkes erişebilir.

private: - bu anahtar kelimeye sahip sınıf üyelerine sınıfın kendisinden erişilir. özel verilere alt sınıftan erişemiyoruz. Üyeleri dış sınıf erişiminden korur.

korumalı: - alt sınıfların korumalı üst sınıf üyelerine erişmesine izin verilmesi dışında özel ile aynı.

Şimdi erişim değiştiriciyi anlamak için tabloya bakın Makalenin tamamını okuyun php access modifire


1

Public: bir değişkeni veya yöntemi bildirdiğinizde varsayılan bir durumdur, nesneye doğrudan herhangi bir şey tarafından erişilebilir.

Protected: Yalnızca nesne ve alt sınıflar içinden erişilebilir.

Private: Alt sınıflar değil, yalnızca nesne içinde başvurulabilir.


0

Bahsedilen anahtar kelimeler erişim değiştiricilerdir ve Kapsülleme (veya bilgi gizleme) uygulamamıza yardımcı olur. Derleyiciye hangi sınıfların tanımlanmış alana veya yönteme erişimi olması gerektiğini söylerler.

private - Alana veya yönteme yalnızca geçerli sınıf erişebilir.

korumalı - Bu sınıfın yalnızca geçerli sınıfı ve alt sınıfları (ve bazen de aynı paket sınıfları) alana veya yönteme erişebilir.

public - Herhangi bir sınıf alana başvurabilir veya yöntemi çağırabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.