2015-06-15 3 views
2

Существует несколько типов ответов от моего поставщика услуг, поэтому я создал конфигурационный массив, как показано ниже.Динамические переменные объекта доступа в php

$configArray = array(
    'type_1' => array(
    'name' => array('parent', 'user', 'profile', 'name', 'fullName') 
    ), 
    'type_2' => array(
    'name' => array('parent', 'person', 'info', 'basic', 'name') 
    ) 
); 

Так что, если типа возвращаемого значения «тип 1» объект пути «имя» переменной $obj->parent->user->profile->name->fullName и то же самое для 2-го типа является $obj->parent->person->basic->name

Моим вопроса, что является правильной реализацией в PHP установить динамический путь объекта? Сейчас мой план состоит в том, чтобы реализовать, как показано ниже.

$path = ''; 
foreach($configArray[$type]['name'] as $chunks){ 
    if($path != ''){ $path .= '->'; } 
    $path .= $chunks; 
} 

Будет полезно, если кто-то может предложить стандартный метод.

Спасибо заранее, Tismon Varghese

+2

Не позволяйте внешним входам решать, как вызывать имена объектов без дезинфекции ввода. В противном случае ваш код будет открыт для попыток взлома. Стандартный метод состоит в том, чтобы иметь конструкторские функции, которые обрабатывают ввод и возвращают экземпляр объекта. – Tschallacka

ответ

1

Вы можете добиться этого с помощью eval(), однако я не буду рекомендовать этот метод как он склонен к удаленному выполнению кода, если вход приходит извне:

$path = ''; 
foreach($configArray['type_1']['name'] as $chunks){ 
    $path .= '->'.$chunks; 
} 
// $config will have value of $obj->parent->user->profile->name->fullName 
eval('$config = $obj'.$path.';'); 

Вместо этого вы можете перебрать каждый данный объект в пути объекта и можешь проверить, если свойство существует в объекте:

// Say $obj is your root object 
foreach($configArray[$type]['name'] as $prop) { 
    if (!is_object($obj)) break; 
    if (property_exists($obj, $prop)) {    
     $obj = $obj->$prop; 
    }   
} 

// This will have value of say $obj->parent->user->profile->name->fullName 
print_r($obj); 
+0

Спасибо, Ульвер. Измененный код, как предлагается, поскольку это кажется разумным. –

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