У меня был случай, когда я случайно начал разворачивать каталог файлов в корне. Он добавил файл .htaccess из моей папки с файлами, который блокирует все php
# If we know how to do it safely, disable the PHP engine entirely.
<IfModule mod_php5.c>
php_flag engine off
</IfModule>
. Нижняя строка проверяет файл .htaccess на root.
Это то, на что предназначен «защищенный», поскольку главу Visibility объясняет:
Объявленные защищенные члены могут быть доступны только внутри самого класса и наследуются и родительских классов.
blockquote>Если вам нужно получить доступ к свойству извне, выберите один из них:
- Не объявляйте его защищенным, сделайте его общедоступным
- Напишите пару функций для получения и установки значения (getters and setters)
Если вы не хотите изменять оригинальный класс (потому что это сторонняя библиотека, вы не нужно путаться) создать пользовательский класс, который расширяет исходный:
class MyFields_Form_Element_Location extends Fields_Form_Element_Location{ }
... и добавьте там свой приемник / сеттер.
Если вы не можете изменить исходный класс и расширить его, это тоже не вариант, вы можете использовать интерфейс ReflectionProperty.
Библиотека phptoolcase имеет удобный способ для этого:
$value = PtcHandyMan::getProperty( $your_object , ‘propertyName’);
Статическое свойство из одноэлементного класса:
$value = PtcHandyMan::getProperty( ‘myCLassName’ , ‘propertyName’);
Вы можете найти инструмент здесь: http://phptoolcase.com/guides/ptc-hm-guide.html
Вот простой пример (без проверки ошибок) использования ReflectionClass
:
function accessProtected($obj, $prop) {
$reflection = new ReflectionClass($obj);
$property = $reflection->getProperty($prop);
$property->setAccessible(true);
return $property->getValue($obj);
}
Я знаю, что вы сказали, что ограничены 5.2, но это было 2 года назад 5.5 является самой старой поддерживаемой версией , и я надеюсь помочь людям с современными версиями.
Объект может быть типизирован в (ассоциативный) массив, а защищенные члены имеют ключи с префиксом chr(0).'*'.chr(0)
(см. комментарий @ fardelian здесь ). Используя эту непризнанную функцию, вы можете написать «exposer»:
function getProtectedValue($obj,$name) {
$array = (array)$obj;
$prefix = chr(0).'*'.chr(0);
return $array[$prefix.$name];
}
В качестве альтернативы вы можете проанализировать значение из строки serialized , где (кажется) защищенные члены имеют одинаковые (надеюсь, что php 5.2 не изменил его).
$propGetter = Closure::bind( function($prop){return $this->$prop;}, $element['field_text']['#object'], $element['field_text']['#object'] );
drupal_set_message('count='.count($propGetter('hostEntity')->field_captioned_carousel['und']));
Teach a man to fish
- хорошая аналогия здесь.
– Regular Joe
9 March 2017 в 00:18
Если вы хотите возиться с классом, не добавляя геттеры и сеттеры ....
PHP 7 добавляет метод вызова ($ obj) (быстрее старого bindTo) на закрытие, позволяя вам вызвать так что переменная $this
будет действовать так же, как и в классе - с полными разрешениями.
//test class with restricted properties
class test{
protected $bar="protected bar";
private $foo="private foo";
public function printProperties(){
echo $this->bar."::".$this->foo;
}
}
$testInstance=new test();
//we can change or read the restricted properties by doing this...
$change=function(){
$this->bar="I changed bar";
$this->foo="I changed foo";
};
$change->call($testInstance);
$testInstance->printProperties();
//outputs I changed bar::I changed foo in php 7.0