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

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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
InviS
Отправлено: 10 Мая, 2011 - 08:52:02
Post Id


Гость


Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Ребят, подскажите, пожалуйста, можно ли как-то в класс передать значение массива. Точнее, если у меня есть public переменная, я знаю, что это массив, могу ли я как-то задать значение типа:


Где $s - объект этого класса, а $arrayVar - переменная-массив.
Если можно, то как?
И можно ли это делать с неопределенными переменными через __set?

(Отредактировано автором: 10 Мая, 2011 - 08:52:19)

 
 Top
EuGen Администратор
Отправлено: 10 Мая, 2011 - 09:03:11
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Через __set конечно можно.
Проще всего (и правильнее) присваивать значение свойства так:

Или если важен индекс, то
PHP:
скопировать код в буфер обмена
  1.  
  2. $rgData=array();
  3. ////
  4. $rgData[20]=true;
  5. $s -> arrayVar = $rgData;
  6.  


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
InviS
Отправлено: 10 Мая, 2011 - 09:09:44
Post Id


Гость


Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Ага.. понятно. Скажите, А при таком раскладе получается, что для того, чтоб добавить еще одну переменную к нашему массиву, то его надо сначала извлечь, добавить и переприсвоить?
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 (может мы ее очистим или переприсвоим... Можно ли как-то без этого "туда-обратно"? или только так?
 
 Top
EuGen Администратор
Отправлено: 10 Мая, 2011 - 09:13:59
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Можно так, но обычно я предпочитаю не использовать {..}
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.  


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Champion Супермодератор
Отправлено: 10 Мая, 2011 - 09:15:05
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Нее, если массив есть, то можно в него дописывать без извлечения и переприсваивания
 
 Top
InviS
Отправлено: 10 Мая, 2011 - 09:21:02
Post Id


Гость


Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




EuGen, спасибо, работает и без {}, скажите, а можно теперь вот эту конструкцию

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


То он у меня срабатывает только для обычных переменных. Типа


А когда пишу конструкцию, которую я указал во второй строчке, то тупо ничего не происходит. Можно ли как-то узнать имя, индекс и значение в таком случае?
 
 Top
EuGen Администратор
Отправлено: 10 Мая, 2011 - 09:28:06
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




__set устанавливает значение тогда, когда происходит обращение к необъявленному свойству.
Стало быть, если у Вас есть скалярное свойство, которое объявлено, __set не вызовется и для него.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
InviS
Отправлено: 10 Мая, 2011 - 09:30:54
Post Id


Гость


Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




EuGen, я это понял. Но если мой массив (будущий) еще не был объявлен, то я никак не могу узнать имя и ключ, которому я пытаюсь присвоить значение? (также, как переменной)
 
 Top
EuGen Администратор
Отправлено: 10 Мая, 2011 - 09:43:11
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




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.  


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
InviS
Отправлено: 10 Мая, 2011 - 09:52:03
Post Id


Гость


Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




EuGen
Если оставить var_dump только внутри __set, то вот что мы получим:
CODE (htmlphp):
скопировать код в буфер обмена
  1. string(1) "a"
  2. string(1) "b"


Получается, что установка значения для bar прошла как-то в обход __set???
 
 Top
EuGen Администратор
Отправлено: 10 Мая, 2011 - 09:56:39
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




У меня вывод такой:
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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
InviS
Отправлено: 10 Мая, 2011 - 10:00:22
Post Id


Гость


Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Ну у меня тоже. Я же сделал приписку, что если закомментировать последний var_dump, который сделан для вывода объекта, то получим всего две строчки. У вас то же.
Смотрите, по сути сработал __set только для

А как же второе присваивание? почему оно обошло __set?
 
 Top
EuGen Администратор
Отправлено: 10 Мая, 2011 - 10:03:31
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Это одна из недоработок (сложно назвать ошибкой) 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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
InviS
Отправлено: 10 Мая, 2011 - 10:06:10
Post Id


Гость


Покинул форум
Сообщений всего: 107
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Понятно)) плохо, что так... Спасибо большое за помощь!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB