Имя переменной как $ this-> value? - PullRequest
0 голосов
/ 11 июля 2011

Я сейчас нахожусь в разработке моего класса на PHP.У меня есть массив со значениями в нем, и я хотел бы использовать имя поля массива в качестве ссылки $ this.Позвольте мне показать вам, что я получил:

<?php
class Server {    
    private $playlist;
    private $mp3;
    private static $ressourceFolder;
    private static $sudoUser;

И в моем массиве он содержит:

  array(6) {
    ["playlist"]=>
    int(8002)
    ["mp3"]=>
    int(1024)
    ["ressourceFolder"]=>
    bool(true)
    ["sudoUser"]=>
    bool(true)
  }

Так что я хотел бы использовать в моем foreach что-то, чтобы получить значение массиваполе в глобальную переменную класса, имя поля массива совпадает с переменной, так что это «должно» работать, но это не так: (

foreach($ressourceArray as $ressourceField=>$ressourceValue) {    
    $this->$ressourceField = $ressourceValue;
}

Я был бы очень признателен, если бы кто-то мог сказать мне, почему этоне может работать и как сделать это «работоспособным» ...

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 11 июля 2011

Это работает, см. Демо :

<?php

$array = array("playlist"=> 8002, "mp3"=>1024);

class Mix {
   public function __construct($array) {
    foreach($array as $key => $value) {
        $this->$key = $value;
      }
   }
}

$class = new Mix($array);
var_dump($class);

Он назначит новые открытые члены для объекта $this на основе пар ключ / значение массива.

Работа с плохо именованными ключами в массиве

Если ключи содержат значения, которые не являются допустимыми именами переменных, доступ к свойствам позже может быть нетривиальным ({property-name}), см. Синтаксис фигурных скобок PHP для переменной-члена .

Приведение массива к объекту перед добавлением поможет предотвратить фатальные ошибки для тех имен ключей, которые полностью недействительны:

$object = (object) $array;
# iterate over object instead of array:
foreach($object as $key => $value) {
  $this->$key = $value;
}

Эти ключи только что сброшены актерами.

0 голосов
/ 11 июля 2011

И в моем массиве он содержит:

Какой массив? Это похоже на дамп массива экземпляра класса.

в глобальную переменную класса

Какая глобальная переменная класса? Классы не являются переменными. Переменные могут содержать ссылки на объекты или имена классов.

Предполагая, что вы хотите перебрать свойства объекта, и

$ressourceArray = new Server();

Код будет работать как положено.

Если цикл находится внутри метода класса, тогда цикл должен быть ....

foreach($this as $ressourceField=>$ressourceValue) {    
   $this->$ressourceField = $ressourceValue;
}

Если вы имеете в виду, что вы пытаетесь инициализировать свойства объекта из массива ...

class Server {
...
function setValues($ressourceArray)
{
   foreach($ressourceArray as $ressourceField=>$ressourceValue) {    
      $this->$ressourceField = $ressourceValue;
   }
}

(Кстати, в 'ресурсе' есть только одно 's')

0 голосов
/ 11 июля 2011

Вы можете заставить его работать магическим методом __set и __get. Смотри: http://php.net/manual/en/language.oop5.magic.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...