объекты php определяют и устанавливают атрибуты в конструкторе - PullRequest
2 голосов
/ 16 ноября 2009

Можно ли определить атрибуты класса в конструкторе. Например, я передаю ассоциативный массив в конструктор класса и хочу, чтобы атрибуты этого класса были объявлены и установлены на основе содержимого ассоциативного массива.

ТИА

Ответы [ 3 ]

2 голосов
/ 16 ноября 2009
class Foo{
   function __construct($arr){
       foreach($arr as $k => $v)
          $this->$k = $v;
   }
}

Вы можете просмотреть руководство по свойствам и .

следует отметить, так как вы не определяете свойства в классе, все установлены в public , что IMHO является опасным. Я думаю, что можно достичь того же, используя отражение . Я только что проверил более подробно отражение, и это невозможно (с PHP5), так как было бы целесообразно сделать это из отражения, которое может прийти с PHP6.

полный образец

<?php
class Foo{
   function __construct($arr){
       foreach($arr as $k => $v)
          $this->$k = $v;
   }

   function getBar(){
       return $this->bar;
   }
}

$bar = new Foo(array(
    'bar' => 'bar',
    'foo' => 'foo'
)
);

var_dump($bar->bar);
?>
0 голосов
/ 18 ноября 2009

Вы, конечно, можете сделать это, как RageZ описывает выше, но я не думаю, что я бы рекомендовал это делать. То, что это делает, создает слишком свободный «контракт» между пользователями этого класса - то есть никто действительно не знает, какими свойствами обладает класс.

Вместо того, чтобы определять свойства на лету, я бы поспорил, что у вас есть предопределенный набор «наборов свойств объекта», которые, в свою очередь, могут определять иерархию классов.

Так что вместо того, чтобы делать

  • если я получу массив с "a = 2 и b = 3 ", создайте объект с $ obj-> a = 3 и $ obj-b = 3
  • если я получу массив с "c = 5", создайте объект с $ obj-> c = 5

Сделайте это:

  • определить класс для MyObjectOfTypeOne, который имеет свойства $ a и $ b
  • определить класс для MyObjectOfTypeTwo со свойством $ c

Затем используйте шаблон Factory для создания правильного типа объекта в зависимости от параметров, передаваемых статическому заводскому методу.

0 голосов
/ 16 ноября 2009

Да, вы можете сделать это. с макушки головы

public function __constructor($data){
  foreach($data as $k=>$v){
     $this->{$k} = $v;
  }
}

Это должно сделать это, и, конечно, вам нужно математически определить поля.

Я не слишком уверен, что это {$ k} или $ {k}, или $ {$ k}, но любой из них должен работать.

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