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

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

14
задан Seb Rose 13 August 2010 в 09:38
поделиться

5 ответов

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

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

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

$baz = new Foo();

echo $baz->getBar();
13
ответ дан 1 December 2019 в 06:18
поделиться

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

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

$rp = new ReflectionProperty('Foo', 'bar');
$rp->setAccessible(true);
echo $rp->getValue($foo);
19
ответ дан 1 December 2019 в 06:18
поделиться

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

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

Если их нет и вы убеждены, что вам действительно нужны эти защищенные члены, вы можете расширить тип с помощью методов доступа, привести их и получить их таким образом. Как (в 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 создает паршивый компилятор, поэтому я не смог его протестировать. }

-3
ответ дан 1 December 2019 в 06:18
поделиться

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

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

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

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

4
ответ дан 1 December 2019 в 06:18
поделиться

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

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

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

0
ответ дан 1 December 2019 в 06:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: