Подтвердить что ты не робот

Доступ к защищенной переменной-члену вне класса

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

4b9b3361

Ответ 1

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

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

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

$baz = new Foo();

echo $baz->getBar();

Ответ 2

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

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

$rp = new ReflectionProperty('Foo', 'bar');
$rp->setAccessible(true);
echo $rp->getValue($foo);

Ответ 3

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

Мы можем использовать методы 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

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

Вы не можете: чтобы весь пункт protected.

Вам придется extend класс с помощью метода, который извлекает для вас переменные.

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

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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

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

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 делает для паршивого компилятора, поэтому я не смог его протестировать. }