Анонимные классы, доступ к частным свойствам расширенного класса [duplicate]

Предыдущие ответы предполагают, что ветвь, подлежащая сбросу, является текущей ветвью (выведено). В комментариях OP hap497 пояснил, что ветвь действительно проверена, но это явно не требуется исходным вопросом. Поскольку существует хотя бы один «повторяющийся» вопрос, Полностью отбросить ветвь до состояния репозитория , который не предполагает, что ветвь проверена, вот альтернатива:

Если ветка " mybranch "в настоящий момент не проверяется, чтобы сбросить его на удаленную ветвь« myremote / mybranch », вы можете использовать эту команду low-level :

git update-ref refs/heads/mybranch myremote/mybranch

метод оставляет извлеченную ветвь такой, какой она есть, а рабочее дерево - нетронутым. Он просто перемещает голову mybranch в другую фиксацию, независимо от того, что указано в качестве второго аргумента. Это особенно полезно, если несколько ветвей необходимо обновить до новых удаленных головок.

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

11
задан Alex 23 July 2012 в 00:51
поделиться

2 ответа

class A
{
    private $b = 'c';
}

$obj = new A();

$r = new ReflectionObject($obj);
$p = $r->getProperty('b');
$p->setAccessible(true); // <--- you set the property to public before you read the value

var_dump($p->getValue($obj));
29
ответ дан zerkms 20 August 2018 в 07:51
поделиться
  • 1
    ваш пример, похоже, работает, но мой не делает :( Может ли это потому, что мой класс - это дочерний класс? – Alex 23 July 2012 в 00:58
  • 2
    @Alex: см. Разницу между ними. Там определенно то, что вы пропустили – zerkms 23 July 2012 в 00:59
  • 3
    @Alex: yep, private видны только для классов, в которых они были созданы. Но в этом случае hasProperty вернет false – zerkms 23 July 2012 в 00:59
  • 4
    вот и все: s codepad.org/lx8ecZMz .. Есть ли способ получить свойства дочернего класса? – Alex 23 July 2012 в 01:01
  • 5
    Я понимаю, что вопрос очень старый, но я просто потратил немного времени на поиск способа доступа к родительскому значению частной собственности от ребенка и чтения таких неполных ответов, и я надеюсь, что это сэкономит время: $p = $r->getParentClass()->getProperty('b'); – AlexandrX 28 May 2017 в 05:11

getProperty генерирует исключение, а не ошибку. Значимость заключается в том, что вы можете справиться с этим и сохранить себя if:

$ref = new ReflectionObject($obj);
$propName = "myProperty";
try {
  $prop = $ref->getProperty($propName);
} catch (ReflectionException $ex) {
  echo "property $propName does not exist";
  //or echo the exception message: echo $ex->getMessage();
}

Чтобы получить все частные свойства, используйте $ref->getProperties(IS_PRIVATE);

1
ответ дан Traveling Tech Guy 20 August 2018 в 07:51
поделиться
  • 1
    голова вверх, IS_PRIVATE должна быть ReflectionProperty::IS_PRIVATE – Nicola Pedretti 25 January 2018 в 00:03
Другие вопросы по тегам:

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