SORU
5 Aralık 2010, Pazar


PHP: Kamu, Özel, Korumalı

Ne zaman ve neden arasında . fark ne kullanmalıyım ^strong>kamu,özelvekorumalıfunctions/variables içindesınıf?

Örnekler:

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

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

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

CEVAP
20 ŞUBAT 2014, PERŞEMBE


dd

Kamu:

public şeklinde bir yöntem (fonksiyon) veya özellik (değişken) bildirdiğinizde bu yöntemleri ve özellikleri erişilebilir olabilir:

  • Aynı sınıf olduğunu ilan etti.
  • Yukarıdaki miras alan sınıflar sınıf ilan etti.
  • Bu sınıfın dışında herhangi bir yabancı unsurlar şeyleri de erişebilirsiniz.

Örnek:

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

protected şeklinde bir yöntem (fonksiyon) veya özellik (değişken) bildirdiğinizde bu yöntemleri ve özellikleri erişilebilir olabilir

  • Aynı sınıf olduğunu ilan etti.
  • Yukarıdaki miras alan sınıflar sınıf ilan etti.

Yabancı üye değişkenleri erişemiyor. "Yabancılar" değil anlamındailan sınıf nesne örnekleri.

Örnek:

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

Hata tam olarak bu olacak:

PHP Ölümcül hata: Cannot access korumalı özelliği Dede::$isim


Özel:

private şeklinde bir yöntem (fonksiyon) veya özellik (değişken) bildirdiğinizde bu yöntemleri ve özellikleri erişilebilir olabilir:

  • Aynı sınıf olduğunu ilan etti.

Yabancı üye değişkenleri erişemiyor. Onlar bu anlamda yabancılarilan sınıf nesne örneklerive hatta sınıflarsınıf ilan devralır.

Örnek:

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

Tam hata iletileri:

Dikkat: Tanımsız özellik:::$Baba adı
Ölümcül hata:::$Erişemiyor özel mülkiyet Dede adı


Dede Sınıfı Reflection kullanarak diseksiyon

Bu konu gerçekten kapsam dışı değildir, ve burada sadece yansıma gerçekten güçlü olduğunu kanıtlamak için ekliyorum. Yukarıdaki üç örnekte de ifade ettiği gibi, protected private üyeler (özellikler ve yöntemler) sınıf dışından erişilemez.

Ancak, yansıma ile yapabilirsinizolağanüstühatta erişerekprotectedveprivateüyeler sınıfının dışında!

İyi, yansıma nedir?

Yansıma ters-mühendis sınıfları için yeteneği, arayüzler ekler işlevleri, yöntemleri ve uzantıları. Ayrıca, yollar sunmaktadır fonksiyonlar, sınıflar ve yöntemler için doktor yorum almak.

Önsöz

Bir sınıf Grandpas adlı ve üç özellik var ki. Kolay anlaşılması için, adları ile üç dedeler var düşünün:

  • Mark Henry
  • John Çatışma
  • Will Jones

Bize onları (değiştiriciler ata) public, protected private sırasıyla yapalım. protected private üye sınıf dışından erişilemez olduğunu çok iyi biliyorsun. Şimdi ifadeyi yansıtma kullanarak çelişiyor.

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

Çıkış:

#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ış:

Lütfen örnek ile aşağıda karıştırmayın. Hala gördüğünüz gibi, private protected üyeleri erişilemiyordışarıdayansıma kullanmadan sınıfı

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

Çıkış:

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

Hata ayıklama fonksiyonları

print_r, var_export var_dump debugger functions. Okunabilir bir form içinde bir değişken ile ilgili bilgiler mevcut. Bu üç fonksiyon PHP 5 ile nesne protected private özelliklerini ortaya çıkaracaktır. Statik sınıf üyelerideğilgösterilecek.


Daha fazla kaynak:


Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Outler

    Adam Outler

    19 EKİM 2006
  • Jonah Penna

    Jonah Penna

    11 EYLÜL 2005
  • My Name Is Jeff

    My Name Is J

    26 ŞUBAT 2008