Есть такой класс
class test
{
private $arr = array("test");
public function __construct()
{
$this->{$this->arr['0']} = "test";
}
}
new test;
У меня вопросы.
Насколько верен такой подход к созданию члена класса?
И стоит ли его применять если есть такая "задумка"?
Спустя 57 минут, 12 секунд (15.03.2011 - 21:41) sharki написал(а):
че эт ты замудрил такое непонятное, для чего?
Спустя 1 минута, 56 секунд (15.03.2011 - 21:43) neadekvat написал(а):
Не очень врубился, что тут происходит, но мб стоит посмотреть в сторону __set()?
Спустя 1 минута, 10 секунд (15.03.2011 - 21:44) sharki написал(а):
neadekvat
Set вызывает когда создают новое св-во извне класса, т.е после создания экземпляра класса
Set вызывает когда создают новое св-во извне класса, т.е после создания экземпляра класса
Спустя 1 минута, 44 секунды (15.03.2011 - 21:46) neadekvat написал(а):
sharki, а тут что? Когда конструктор то вызывается?
Спустя 1 минута, 5 секунд (15.03.2011 - 21:47) sharki написал(а):
neadekvat
В конструкторе мы явно знаем что получаем, что устанавливаем, а в set отправляются неизведанные поля
Бред какой то получается тогда думаю ТС нужно еще подумать над тем, что он вообще хочет =)
В конструкторе мы явно знаем что получаем, что устанавливаем, а в set отправляются неизведанные поля
Бред какой то получается тогда думаю ТС нужно еще подумать над тем, что он вообще хочет =)
Спустя 5 минут, 41 секунда (15.03.2011 - 21:53) neadekvat написал(а):
sharki, вот видите. Вы не поняли, что хочет автор, а уже спорите со мной :)
Спустя 1 час, 46 минут, 54 секунды (15.03.2011 - 23:40) doberman написал(а):
Цитата (notname @ 15.03.2011 - 17:44) |
И стоит ли его применять если есть такая "задумка"? |
В контексте приведенного примера - бессмысленно его применять.
Если вся фишка в динамичности создания свойств, то проще сразу обрашаться к несуществующему свойству.
Подобную конструкцию, по-моему, можно использовать лишь только для фильтрации создания свойств, не определенных в классе. Но если в приватном массиве, как в примере, перечислить допустимые, то, опять же, будет проще объявить их явно.
Спустя 1 час, 13 минут, 10 секунд (16.03.2011 - 00:53) Guest написал(а):
Такая конструкция возможна для инициализации больших моделей, например данные формы или таблицы в БД. Пример AR. Но я бы не стал инициализировать непосредственно в конструкторе, опишите другой метод и в нём инициализируйте массив а после собирайте в конструкторе. Инициализация массива в другом методе даст гибкость в логике сокрытия наполнения массива любым образом - данные из БД, данные из XML будет не важно.
Спустя 3 минуты, 13 секунд (16.03.2011 - 00:56) Guest написал(а):
Цитата (doberman @ 15.03.2011 - 20:40) | ||
В контексте приведенного примера - бессмысленно его применять. Если вся фишка в динамичности создания свойств, то проще сразу обрашаться к несуществующему свойству. Подобную конструкцию, по-моему, можно использовать лишь только для фильтрации создания свойств, не определенных в классе. Но если в приватном массиве, как в примере, перечислить допустимые, то, опять же, будет проще объявить их явно. |
Так работают многие бессмысленные парсеры (XML ...)
Спустя 4 минуты, 18 секунд (16.03.2011 - 01:00) Guest написал(а):
Цитата (neadekvat @ 15.03.2011 - 18:53) |
sharki, вот видите. Вы не поняли, что хочет автор, а уже спорите со мной |
Конструктор инициализирует первоначальное состояние объекта, сетеры же меняют его во время жизненного цикла объекта. Две абсолютно разных вещи со стороны проектирования.
Спустя 6 часов, 13 минут, 10 секунд (16.03.2011 - 07:13) neadekvat написал(а):
Цитата (Guest @ 16.03.2011 - 01:00) |
Конструктор инициализирует первоначальное состояние объекта, сетеры же меняют его во время жизненного цикла объекта. Две абсолютно разных вещи со стороны проектирования. |
Важен сам факт того, что объект уже будет.
Логично же, если автор спрашивает, верно/неверно, и мы что-то предлагаем - то придется вносить изменения.
Спустя 2 часа, 59 минут, 6 секунд (16.03.2011 - 10:13) linker написал(а):
Вот так правильно
class test
{
protected _prop = array();
public function __construct()
{
$this->test = "test";
}
public function __set($name, $value)
{
$this->_prop[$name] = $value;
}
public function __get($name)
{
return isset($this->_prop[$name]) ? $this->_prop[$name] : null;
}
}
Спустя 5 часов, 19 минут, 57 секунд (16.03.2011 - 15:32) Guest написал(а):
Цитата (neadekvat @ 16.03.2011 - 04:13) | ||
Важен сам факт того, что объект уже будет. Логично же, если автор спрашивает, верно/неверно, и мы что-то предлагаем - то придется вносить изменения. |
Не факт. При работе с моделями-формами объект не изменяется в течении всего жизненного цикла он остаётся "статичным", поэтому сеттеры ему не нужны. А вот пакетная инициализация свойств из селекторов формы это пожалуйста в конструкторе возможно.