Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Работа с массивами, объявленными в классе. Возможно ли через __set?
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Работа с массивами, объявленными в классе. Возможно ли через __set?

Страниц (1): [1]
 

1. InviS - 10 Мая, 2011 - 08:52:02 - перейти к сообщению
Ребят, подскажите, пожалуйста, можно ли как-то в класс передать значение массива. Точнее, если у меня есть public переменная, я знаю, что это массив, могу ли я как-то задать значение типа:


Где $s - объект этого класса, а $arrayVar - переменная-массив.
Если можно, то как?
И можно ли это делать с неопределенными переменными через __set?
2. EuGen - 10 Мая, 2011 - 09:03:11 - перейти к сообщению
Через __set конечно можно.
Проще всего (и правильнее) присваивать значение свойства так:

Или если важен индекс, то
PHP:
скопировать код в буфер обмена
  1.  
  2. $rgData=array();
  3. ////
  4. $rgData[20]=true;
  5. $s -> arrayVar = $rgData;
  6.  
3. InviS - 10 Мая, 2011 - 09:09:44 - перейти к сообщению
Ага.. понятно. Скажите, А при таком раскладе получается, что для того, чтоб добавить еще одну переменную к нашему массиву, то его надо сначала извлечь, добавить и переприсвоить?
PHP:
скопировать код в буфер обмена
  1. $rgData=array();
  2. $rgData[20]=true;
  3. $s -> arrayVar = $rgData;
  4. // нужно добавить - для этого извлекаем?
  5. $rgData = $s -> arrayVar;
  6. $rgData[30] = false;
  7. $s -> arrayVar = $rgData;


Так получается? если не брать во внимание существование переменной $rgData (может мы ее очистим или переприсвоим... Можно ли как-то без этого "туда-обратно"? или только так?
4. EuGen - 10 Мая, 2011 - 09:13:59 - перейти к сообщению
Можно так, но обычно я предпочитаю не использовать {..}
PHP:
скопировать код в буфер обмена
  1.  
  2. class foo
  3. {
  4.    var $bar=array();
  5.    function __construct()
  6.    {
  7.    }
  8. }
  9. $baz=new foo();
  10. $baz->{bar}['test']='Test data';
  11. var_dump($baz->bar);
  12.  
5. Champion - 10 Мая, 2011 - 09:15:05 - перейти к сообщению
Нее, если массив есть, то можно в него дописывать без извлечения и переприсваивания
6. InviS - 10 Мая, 2011 - 09:21:02 - перейти к сообщению
EuGen, спасибо, работает и без {}, скажите, а можно теперь вот эту конструкцию

как-то через __set отловить?
Когда я пишу обработчик
PHP:
скопировать код в буфер обмена
  1. public function __set($name,$value){
  2.    echo $name;
  3. }


То он у меня срабатывает только для обычных переменных. Типа
PHP:
скопировать код в буфер обмена
  1. $s -> var = 'hello';


А когда пишу конструкцию, которую я указал во второй строчке, то тупо ничего не происходит. Можно ли как-то узнать имя, индекс и значение в таком случае?
7. EuGen - 10 Мая, 2011 - 09:28:06 - перейти к сообщению
__set устанавливает значение тогда, когда происходит обращение к необъявленному свойству.
Стало быть, если у Вас есть скалярное свойство, которое объявлено, __set не вызовется и для него.
8. InviS - 10 Мая, 2011 - 09:30:54 - перейти к сообщению
EuGen, я это понял. Но если мой массив (будущий) еще не был объявлен, то я никак не могу узнать имя и ключ, которому я пытаюсь присвоить значение? (также, как переменной)
9. EuGen - 10 Мая, 2011 - 09:43:11 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. class foo
  3. {
  4.    function __construct()
  5.    {
  6.    }
  7.    function __set($name, $value)
  8.    {
  9.       var_dump($name, $value);
  10.       $this->$name=$value;
  11.    }
  12. }
  13. $baz=new foo();
  14. $baz->a='b';
  15. $baz->{bar}['test']='Test data';
  16. var_dump($baz);
  17.  
10. InviS - 10 Мая, 2011 - 09:52:03 - перейти к сообщению
EuGen
Если оставить var_dump только внутри __set, то вот что мы получим:
CODE (htmlphp):
скопировать код в буфер обмена
  1. string(1) "a"
  2. string(1) "b"


Получается, что установка значения для bar прошла как-то в обход __set???
11. EuGen - 10 Мая, 2011 - 09:56:39 - перейти к сообщению
У меня вывод такой:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. string 'a' (length=1)
  3.  
  4. string 'b' (length=1)
  5.  
  6. object(foo)[1]
  7.   public 'a' => string 'b' (length=1)
  8.   public 'bar' =>
  9.     array
  10.       'test' => string 'Test data' (length=9)
  11.  
  12.  

Установка произошла в обход __set, верно
php 5.2
12. InviS - 10 Мая, 2011 - 10:00:22 - перейти к сообщению
Ну у меня тоже. Я же сделал приписку, что если закомментировать последний var_dump, который сделан для вывода объекта, то получим всего две строчки. У вас то же.
Смотрите, по сути сработал __set только для

А как же второе присваивание? почему оно обошло __set?
13. EuGen - 10 Мая, 2011 - 10:03:31 - перейти к сообщению
Это одна из недоработок (сложно назвать ошибкой) PHP:
PHP:
скопировать код в буфер обмена
  1.  
  2. class foo
  3. {
  4.    function __construct()
  5.    {
  6.    }
  7.    function __set($name, $value)
  8.    {
  9.       var_dump($name, $value);
  10.       $this->$name=$value;
  11.    }
  12. }
  13. $baz=new foo();
  14. $baz->a='b';
  15. $baz->bar=array('test'=>'Test data');
  16. var_dump($baz);
  17.  

Произойдет через __set
14. InviS - 10 Мая, 2011 - 10:06:10 - перейти к сообщению
Понятно)) плохо, что так... Спасибо большое за помощь!

 

Powered by ExBB FM 1.0 RC1