Я получил класс из 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;