2015-02-11 3 views
0

Я знаю, как работают PHP динамические вары, я знаю, что я могу получить доступ свойства объекта, как $object->{'somethingWith$var'}; или как $object->$var;PHP динамический вар из строки

Но то, что я пытаюсь добиться, чтобы получить доступ к $object->property->subproperty из $object и строки $string = 'property->subproperty';.

Я попробовал $object->$string, $object->{$string}, $object->$$string hahaha, нет работал.

Кто-нибудь знает, как это сделать? :)

ответ

4

Вы можете написать простую функцию, что-то вроде этого:

function accessSubproperty($object, $accessString) { 
    $parts = explode('->', $accessString); 
    $tmp = $object; 
    while(count($parts)) { 
     $tmp = $tmp->{array_shift($parts)}; 
    } 
    return $tmp; 
} 
+0

Спасибо, это то, что я считаю лучшим тогда. Я предпочел бы использовать подход foreach, предложенный nl-x bellow, потому что я буду использовать его только один раз, но идея здесь, и вы были первыми. Спасибо. – antoni

2

Нет такого способа сделать это.

Вы должны сначала назначить $property = $object->$propertyName, а затем получить доступ к var, который вы хотели бы получить $property->$subpropertyName.

В ваших примерах строка property->subproperty будет обрабатываться как имя переменной, которая, очевидно, не существует.

+0

Хорошо, спасибо за объяснение и быстрый ответ, я искал решение, хотя. также, я обычно могу получить доступ непосредственно к объекту $ object-> property-> без назначения, или я не понял, что вы имели в виду :) – antoni

1

Это не работает, потому что все, что вы выполняете с попытками становятся $object{'property->subproperty'}, который с курсом не то же самое, как $object->{'property'}->{'subproperty'}.

Что вы можете сделать, это:

$ret = $object; 
foreach (explode("->",$string) as $bit) 
    $ret = $ret->$bit; 

Или вам придется пойти на уродливой и злой eval() (пусть начало downvoting):

eval("return \$object->$string;") 
+0

Единственное, что добавляет к [ответу Брабека] (http://stackoverflow.com/a/28454989/227299), - это тот факт, что вы можете использовать 'eval', который действительно не является большим предложением из-за последствий безопасности. –

+0

Я ценю путь foreach и буду использовать его. Я не полагаюсь на eval 0 :) Спасибо – antoni

+0

@disadb Итак, вы использовали ответ, но приняли другой ответ :)? –

Смежные вопросы