PHP üye işlevi özel bir değişkene erişmeye

5 Cevap php

Ben temelde bu yüzden gibi, Exception bir türetilmiş sınıf var:

class MyException extends Exception {

    private $_type;

    public function type() {
    	return $this->_type; //line 74
    }

    public function __toString() {

        include "sometemplate.php";
        return "";

    }

}

Sonra, ben MyException şöyle türetilmiştir:

class SpecialException extends MyException {

    private $_type = "superspecial";

}

I throw new SpecialException("bla"), bir işlevi, onu yakalamak ve bu görüntüler, daha sonra __toString işlevi bir şablon yüklemek gerekir, echo $e gitmek, ve sonra aslında hiçbir şey geri değilse echo.

Bu şablon dosyasında ne temelde

<div class="<?php echo $this->type(); ?>class">

    <p> <?php echo $this->message; ?> </p>

</div>

aklımda, bu kesinlikle çalışması gerekir. Ancak, ben bir istisna atılır aşağıdaki hatayı alıyorum ve bunu görüntülemek için deneyin:

Fatal error: özel mülkiyet SpecialException :: $ _TYPE erişemiyor C:\path\to\exceptions.php on line 74

Ben burada kural ihlal ediyorum Herkes neden açıklayabilir misiniz? Bu kod ile korkunç esprili bir şey yapıyor muyum? Bu durumun üstesinden gelmek için çok daha deyimsel bir yolu var mı? $_type değişkeninin nokta farklı bir div class yakaladı istisna türüne bağlı olarak kullanılır olmasını istediğiniz (gösterildiği gibi).

5 Cevap

Korunan değişkeni Adı:

* Public: anyone either inside the class or outside can access them
* Private: only the specified class can access them. Even subclasses will be denied access.
* Protected: only the specified class and subclasses can access them

özel bir özelliğe erişmek için nasıl sadece bir örnek

<?php
class foo {
    private $bar = 'secret';
}
$obj = new foo;


if (version_compare(PHP_VERSION, '5.3.0') >= 0)
{

      $myClassReflection = new ReflectionClass(get_class($obj));
      $secret = $myClassReflection->getProperty('bar');
      $secret->setAccessible(true);
      echo $secret->getValue($obj);
}
else 
{
    $propname="\0foo\0bar";
    $a = (array) $obj;
    echo $a[$propname];
}

Sen korunan erişimi ayarlamak gerekir. Özel o sadece kendi sınıf içinde erişilebilir ve miras olamaz anlamına gelir. Korumalı o inhherited için ama yine sınıf dışında doğrudan erişilemez verir.

Eğer kontrol bir açıklama gömülü visibility belgeler olduğunu:

/ / Biz kamu ve korumalı yöntemi redeclare, ama özel değil

Bunu protected yapmak için çalışıyoruz ne yapmak gerekir.

Bu arada, bu sadece sınıf adı olması ayar konum gibi görünüyor - sadece kullanabilirsiniz get_class() :

<div class="<?php echo get_class($this); ?>class">

Siz gerçekten protected zaman you'e miras sınıfları builing için accessmodifier değiştirmek gerekir.

Olsa ekstra bir nokta; kullanmak return ""; ama sadece return; kullanmayın