2015-04-17 7 views
0

Это может быть невозможно, но было бы полезно знать в любом случае.Ссылка PHP-ключ объекта как параметр функции

Я ищу использовать метод для запуска процесса, который повторяется в пользовательском классе, который я написал.

Одним из параметров функции, Target, необходимо обратиться к ключу объекта в $ значений, поэтому ниже фрагмент кода, это относится к $ ценностно> Target.

public function format_array($post_id, $object, $values, Target, $meta_value) { 
    $array = (array) $object; 
    $feed_values = array(); 

    if (!empty($array)) { 
     foreach ($values as $value) { 
      $feed_values[] = $value->Target; 
     } 
    } 

    unset($array); 

    $db_values = get_post_meta($post_id, $meta_value, true); 

    $result = array_diff($feed_values, $db_values); 

    if (!empty($result)) { 
     $this->update_post_meta($post_id, $meta_value, $feed_values); 
    } 
} 

Я знаю, что этот код в настоящее время сломана ...

Можно ли это сделать?

EDIT

Ссылаясь на $ ценностно> Target, где $ значение является примером объекта ниже, я пытаюсь получить доступ к 'комментарий', так что $ ценностно> Комментарий:

object(stdClass)#411 (33) { 
    ["Facilities"]=> 
    object(stdClass)#413 (1) { 
    ["FacilityInfo"]=> 
    array(6) { 
     [0]=> 
     object(stdClass)#414 (4) { 
     ["ID"]=> 
     string(21) "xxxxx" 
     ["PropertyID"]=> 
     string(21) "xxxxx" 
     ["Name"]=> 
     string(5) "xxxxx" 
     ["Comment"]=> 
     string(9) "xxxxx" 
     } 
     [1]=> 
     object(stdClass)#415 (4) { 
     ["ID"]=> 
     string(21) "xxxxx" 
     ["PropertyID"]=> 
     string(21) "xxxxx" 
     ["Name"]=> 
     string(15) "xxxxx" 
     ["Comment"]=> 
     string(20) "xxxxx" 
     } 
    } 
    } 
    ["Photos"]=> 
    object(stdClass)#420 (1) { 
    ["PhotoInfo"]=> 
    array(5) { 
     [0]=> 
     object(stdClass)#421 (6) { 
     ["ID"]=> 
     string(21) "xxxxx" 
     ["PropertyID"]=> 
     string(21) "xxxxx" 
     ["MainPhoto"]=> 
     bool(true) 
     ["Name"]=> 
     string(8) "xxxxx" 
     ["Type"]=> 
     string(5) "Photo" 
     ["PhotoUrl"]=> 
     string(94) "xxxxxx" 
     } 
     [1]=> 
     object(stdClass)#422 (6) { 
     ["ID"]=> 
     string(21) "xxxxx" 
     ["PropertyID"]=> 
     string(21) "xxxxx" 
     ["MainPhoto"]=> 
     bool(false) 
     ["Name"]=> 
     string(2) "xxxxx" 
     ["Type"]=> 
     string(5) "Photo" 
     ["PhotoUrl"]=> 
     string(94) "xxxxxxx" 
     } 
    } 
    } 
} 

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

$array = (array) $letmc->Facilities; 
$comments = array(); 

if (!empty($array)) { 
    foreach ($letmc->Facilities->FacilityInfo as $Facility) { 
     $comments[] = $Facility->Comment; 
    } 
} 

unset($array); 

$property_comments = get_post_meta($post_id, 'property_comments', true); 

$result = array_diff($comments, $property_comments); 

if (!empty($result)) { 
    $this->update_post_meta($post_id, 'property_comments', $comments); 
} 

$array = (array) $letmc->Photos; 
$photos = array(); 

if (!empty($array)) { 
    foreach ($letmc->Photos->PhotoInfo as $Photo) { 
     $photos[] = $Photo->PhotoUrl; 
    } 
} 

unset($array); 

$property_photos = get_post_meta($post_id, 'property_photos', true); 

$result = array_diff($photos, $property_photos); 

if (!empty($result)) { 
    $this->update_post_meta($post_id, 'property_photos', $photos); 
} 
+0

'Target' Свойство объекта должен иметь' public' доступа, чтобы позволить вам получить доступ к нему из-за пределов определения класса.Лучшей альтернативой будет создание общедоступного метода доступа для получения этого значения, поэтому у вас будет что-то вроде: '$ value-> getTarget()'; – NaijaProgrammer

+0

Вы можете использовать волшебный метод '__get()' для извлечения членов класса переменных: http://stackoverflow.com/questions/4713680/php-get-and-set-magic-methods – CD001

+0

@NaijaProgrammer Может ли кто-либо из вас использовать ваши ответы, и я отметю правильно ... Я не совсем понимаю, как подойти к любому решению –

ответ

2

Не совсем уверен, в чем ваш вопрос, но ... как?

function foo($obj, $property) { 
    echo $obj->$property; 
} 

$bar = new stdClass; 
$bar->baz = 42; 

foo($bar, 'baz'); 

См. variable variables in PHP.

+0

Я не могу заставить это работать, извините –

+0

Вверх проголосовали за то, что @deceze добрался до меня, и это правильно. – DanielM

+0

@SamHolguin, если это не работает (это должно быть), вы могли бы попробовать поместить фигурные скобки вокруг имени свойства, когда он вызывается в функции foo() ... это ** не должно быть ** необходимо, но это гарантирует, что ' $ property' оценивается до его вызова: ie 'echo $ obj -> {$ property};' – CD001

0

AS CD001, предлагается, вы можете использовать магический метод __get(). Например, в одном из классов, свойства которых вы пытаетесь получить доступ, вы могли бы сделать это:

class Foo 
{ 
    protected $prop; //property you wish to access outside of the class 

    //magic method 
    public function __get($val) 
    { 
     return isset($this->$val) ? $this->$val : ''; 
    } 
} 
+0

Почему это было отклонено? –

+0

Это не сработает, '_get' принимает параметр. Почему бы просто не сделать фактический метод get – DanielM

+0

Можете ли вы расширить этот @DanielM ?? –

0

Обновленный вопрос делает это красиво и ясно :)

public function format_array($post_id, $object, $values, $target, $meta_value) { 

    ... 

    if (!empty($array)) { 
     foreach ($values as $value) { 
      $feed_values[] = $value->$target; 
     } 
    } 

    ... 
} 

Вы можете проверить $target существует первый, хотя:

public function format_array($post_id, $object, $values, $target, $meta_value) { 

    ... 

    if (!empty($array)) { 
     foreach ($values as $value) { 
      if(property_exists($value, $target) { 
       $feed_values[] = $value->$target; 
      } 
     } 
    } 

    ... 
} 

Потенциал редактирования:

Я думаю, что, возможно, мы смотрим на неправильную вещь, если вы хотите, чтобы obejct в записи для FacilityInfo, тогда вам нужно сделать это так (без петель).

if (!empty($array)) { 
    $feed_values[] = $values->$target; 
} 

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

if (!empty($array) && property_exists($values , $target)) { 
    $feed_values[] = $values->$target; 
} 
+0

Но тогда, чтобы вызвать функцию, которую мне нужно будет use: format_array ($ post_id, $ letmc-> Средства, $ letmc-> Средства-> FacilityInfo, 'Комментарий', 'property_comments'); который выплевывает ошибку? Извините, не знаю, как форматировать код в разделе комментариев –

+0

Я добавил, как выглядит мой рабочий код, код, который я хотел бы создать для функции: –

+0

Какая ошибка? – DanielM

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