доступ к частной переменной из функции-члена в PHP

Я получил класс из Exception , в основном так:

 class MyException extends Exception { private $_type; public function type() { return $this->_type; //line 74 } public function __toString() { include "sometemplate.php"; return ""; } } 

Затем я получил значение MyException следующим образом:

 class SpecialException extends MyException { private $_type = "superspecial"; } 

Если я throw new SpecialException("bla") из функции, поймаю его и throw new SpecialException("bla") echo $e , тогда функция __toString должна загрузить шаблон, отобразить его, а затем фактически не вернуть ничего для эха.

Это в основном то, что находится в файле шаблона

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

на мой взгляд, это должно определенно работать. Однако при возникновении исключения возникает следующая ошибка: я пытаюсь ее отобразить:

Неустранимая ошибка : не удается получить доступ к частной собственности SpecialException :: $ _ type в C: \ path \ to \ exceptions.php в строке 74

Может ли кто-нибудь объяснить, почему я нарушаю правила здесь? Я делаю что-то ужасно острое с этим кодом? Есть ли более идиоматический способ справиться с этой ситуацией? Точка переменной $_type является (как показано), что я хочу использовать другой класс div в зависимости от типа исключения.

Назовите переменную protected:

 * 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 

просто пример доступа к частной собственности

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

См. Мой ответ здесь: https://stackoverflow.com/a/40441769/1889685


Начиная с PHP 5.4 , вы можете использовать предопределенный класс Closure для привязки метода / свойства класса к дельта-функциям, имеющим доступ даже к частным членам.

Класс Closure

Например, у нас есть класс с частной переменной, и мы хотим получить к нему доступ за пределами класса:

 class Foo { private $bar = "Foo::Bar"; } 

PHP 5.4+

 $foo = new Foo; $getFooBarCallback = function() { return $this->bar; }; $getFooBar = $getFooBarCallback->bindTo($foo, 'Foo'); echo $getFooBar(); // Prints Foo::Bar 

Начиная с PHP 7, вы можете использовать новый метод Closure::call для привязки любого метода / свойства объекта obect к функции обратного вызова даже для частных членов:

PHP 7+

 $foo = new Foo; $getFooBar = function() { return $this->bar; } echo $getFooBar->call($foo); // Prints Foo::Bar 

Вам необходимо установить доступ к защищенным. Частное означает, что доступ к нему можно получить только из собственного класса и не может быть унаследован. Защищенный позволяет ему быть включенным, но доступ к нему по-прежнему невозможно получить непосредственно вне класса.

Если вы проверите документацию по видимости , похоронили в комментарии:

// Мы можем повторно использовать открытый и защищенный метод, но не приватный

Вы должны сделать это protected чтобы делать то, что вы пытаетесь сделать.

Кстати, похоже, вы просто устанавливаете его как имя класса – вы можете просто использовать get_class() :

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

Вы действительно должны изменить accessmodifier для protected когда вы создаете классы наследования.

Однако один дополнительный момент; не используйте return ""; но просто используйте return;