Доступ к защищенной переменной-члену вне класса - PullRequest
14 голосов
/ 13 августа 2010

Я запрашиваю идентификатор поля, получая доступ к функции класса, которую кто-то уже установил. Результатом является объект, возвращенный с защищенными переменными-членами. Я изо всех сил пытаюсь понять, как я могу получить доступ к значениям переменных-членов вне класса.

Ответы [ 7 ]

18 голосов
/ 13 августа 2010

Неверный доступ к защищенным или закрытым переменным из открытых (поэтому они являются защищенными или частными).Поэтому лучше расширить класс и получить доступ к требуемому свойству или создать метод получения, чтобы получить его публично.Но если вы все еще хотите получить свойства без расширения и если вы используете PHP 5, вы можете получить доступ к Reflection классам.На самом деле попробуйте ReflectionProperty класс.

class Foo { protected $bar; }
$foo = new Foo();

$rp = new ReflectionProperty('Foo', 'bar');
$rp->setAccessible(true);
echo $rp->getValue($foo);
14 голосов
/ 13 августа 2010

Просто добавьте метод "get" в класс.

class Foo
{
    protected $bar = 'Hello World!';

    public function getBar()
    {
        return $this->bar;
    }
}

$baz = new Foo();

echo $baz->getBar();
13 голосов
/ 17 января 2017

Вот правильный ответ:

Мы можем использовать методы bind () или bindTo класса Closure для доступа к закрытым / защищенным данным некоторого класса, например:

class MyClass {
          protected $variable = 'I am protected variable!';
}

$closure = function() {
          return $this->variable;
};

$result = Closure::bind($closure, new MyClass(), 'MyClass');
echo $result(); // I am protected variable!
4 голосов
/ 13 августа 2010

Я изо всех сил пытаюсь понять, как я могу получить доступ к значениям переменных-членов вне класса.

Вы не можете: В этом весь смысл protected.

Вам нужно будет extend классу с методом, который выбирает переменные для вас.

Вы не можете сделать это для экземпляра объекта - вы должны будете повлиять на определение классаили измените класс объекта в том месте, где он был создан.

3 голосов
/ 18 августа 2016

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

function getProtectedMember($class_object,$protected_member) {
     $array = (array)$class_object;      //Object typecast into (associative) array
     $prefix = chr(0).’*’.chr(0);           //Prefix which is prefixed to protected member
     return $array[$prefix.$protected_member];
}

Пожалуйста, перейдите по ссылке , чтобы узнать больше об этом.

0 голосов
/ 13 августа 2010

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не помню, как кодировать. Прошло много времени". Это может быть полностью отключено.

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

Если их нет, и вы убеждены, что вам действительно нужны эти защищенные члены, вы можете расширить тип с помощью аксессоров, разыграть и получить их таким образом. Как (в C ++ - как код)

class MyClass : public OldClass
{
public:
int getSomeValue() { return protectedValue; }
void setSomeValue(int value) { protectedValue=value; }
char* getOtherValue() { return otherProtectedValue; }
}

и затем использовать его

MyClass* blah = (MyClass*)TheirFactory->GiveMeAClass();
int yay=blah->getSomeValue();

Вы получаете дрейф. Надеюсь, что это работает для вас, Internet Explorer делает паршивый компилятор, поэтому я не смог его протестировать. }

0 голосов
/ 13 августа 2010

Если вам действительно нужно это значение:

  • Измените класс и добавьте открытый метод, который возвращает желаемое значение.
  • Если вы не можете изменить его, рассмотрите возможность его расширения и предоставления значения (оно будет доступно, так как оно защищено). Предпочитаю первый вариант, это скорее взлом.

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

...