Консультация № 98750
17.08.2007, 19:23
0.00 руб.
0 3 3
Уважаемые знатоки! Вопрос по объектно ориентированному программированию.
есть класс (приложение)
пытаюсь обратиться к члену, не получается! В чем проблема?
У меня несколько бОльший код, но суть здесь ясна. Не могу вывести член id. Может это потому, что я передаю конструктору в качестве аргумента массив?
id_pic это поле в базе данных такое

Приложение:
<?//классclass minipic{ var $id; function __construct($pic){ $this->id = $pic[‘id_pic‘]; } }//код$query = "SELECT * FROM pictures WHERE id=‘83‘";$result = mysql_query($query);$a_pic = mysql_fetch_array($result);$mypic = new minipic($a_pic);print $mypic->id;

Обсуждение

Неизвестный
17.08.2007, 19:38
общий
это ответ
Здравствуйте, Бобровский Сергей Сергеевич!
первое: используйте не var a public
второе:
почему ?
$this->id = $pic[\‘id_pic\‘];
а не:
$this->id = $pic[\‘id\‘];
У вас в результирующем запросе нету id_pic, как я понял там есть только id
Второй вариант правильный.
Неизвестный
17.08.2007, 20:03
общий
это ответ
Здравствуйте, Бобровский Сергей Сергеевич!
Справедливости ради надо сказать, что использовать var можно - если на хостинге, который Вы используете, стоит PHP 4. Такое приложение будет работать на любой версии. Так что если Вам следует руководствоваться соображениями совместимости, то надо исходить из версии 4, а это как раз var. Впрочем, думаю, что не очень-то и надо, потому что PHP4 уже морально устарел.
Но если Вы используете Денвер, не потрудившись установить PHP5, то public использовать нельзя. Я имею ввиду, что у Вас PHP 4 установлен в качестве обработчика файлов PHP по умолчанию. При этом PHP5 установлен как CGI. Сталкивался я с такой ситуацией. Именно, когда работал с Денвером.

Отвед на второй вопрос:
Чтобы вывести id, надо в конструкторе обратиться к базе данных. Либо написать метод для класса, который вытаскивает значение из базы, а потом его прописать в конструктор. Ведь как у Вас? Вы написали конструктор. Конструктор - функция которая вызывается раньше всех функций класса. Вы присваиваете свойству значение элемента массива, которого Вы еще не получили. Пропишите так(см. приложение). Итак, последовательность действий:
1) получить значение в конструкторе
2) Присвоить значение свойству

Приложение:
<?//классclass minipic{ var $id; function __construct($pic){$query = "SELECT * FROM pictures WHERE id=\‘83\‘";$result = mysql_query($query);$pic = mysql_fetch_array($result); $this->id = $pic[\‘id_pic\‘]; } }
Неизвестный
17.08.2007, 21:16
общий
это ответ
Здравствуйте, Бобровский Сергей Сергеевич!
После прочтения общения с Бородином Александром Олеговичем хочу спросить - а зачем вам там класс? Если у вас выбирается девять картинок в базе данных и сразу выводятся - то создавать для каждой картинки класс нерезонно. Конечно, если с ним будут производиться действия - это уже другой разговор, но все равно можно обойтись и без классов.
Так же в том коде что вы написали (в приложении) получается что вы каждый раз в одну и ту же переменную присваиваете новый класс, при этом нигде не освобождая старый. Это тоже не совсем верно, так как старый в данном лсучае надо было бы освобождать.

На счет вопроса (кроме того что уже ответили) - функция __construct добавлена в РНР начиная с пятой версии. Судя по всему вы говорили, что у вас 4 - поэтому класс её и не видит - для него это просто функция. В 4-той версии конструктором становилась функция с именем класса - поэтому её вам надо заменить. Смотрите приложение.

Приложение:
while($a_pic=mysql_fetch_array($result)){ $mypic = new minipic($a_pic); print $mypic->id; }class minipic{ var $id; function minipic($pic){ $this->id = $pic[\‘id\‘]; } }...$mypic = new minipic($a_pic);
Форма ответа