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 :: Классы для рисования квадрата и круга

 PHP.SU

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


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

> Без описания
djar
Отправлено: 04 Июня, 2011 - 09:19:10
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Июнь 2011  


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




Только начал изучать ООП. Делаю лабораторную работу.
Нужно создать класс «Фигура», от него два дочерних - «Круг» и «Квадрат». Ну и вывести выбранную фигуру в браузер.

Не выводится изображение. Подскажите, где ошибка?
Без классов всё работает, изображение выводится, параметры из формы передаются.

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3.   if(!isset($_GET['draw']))
  4.     {
  5.       /*
  6.       ** Если ничего не надо рисовать - выводим форму
  7.       */
  8.       echo '<h1>Наследование и полиморфизм</h1>';
  9.  
  10.       echo '
  11.      <form method="post" action="?draw=1">
  12.      Сторона квадрата / диаметр круга = <input name="size" type="text" size="2" maxlength="2"> пикселей<br>
  13.      Тип фигуры: <select name="type"><option value="square">Квадрат</option>
  14.      <option value="circle">Круг</option></select><br>
  15.      Цвет фигуры: <select name="color"><option value="black">Чёрный</option>
  16.      <option value="blue">Синий</option><option value="red">Красный</option>
  17.      <option value="green">Зелёный</option><option value="gray">Серый</option></select><br>
  18.      <input type="submit" value="Нарисовать">
  19.      </form>
  20.      ';
  21.  
  22.       exit;
  23.     }
  24.  
  25.  
  26.  
  27.   /*
  28.   ** Если надо рисовать - пропускаем форму и выполняем следующее:
  29.   */
  30.  
  31.  
  32.   /***************************************** ОПРЕДЕЛЯЕМ КЛАССЫ *****************************************/
  33.  
  34.   /*
  35.   ** Класс «Фигура»
  36.   */
  37.   class Figure
  38.     {
  39.       var $fcolor; // У переменных в классе «Фигура»
  40.       var $fsize; // в начале имени добавлена буква «f»
  41.       var $figure; // переменная, в которую создаётся изображение - она нужна?
  42.  
  43.       function Show($fsize,$fcolor)
  44.         {
  45.           /*
  46.           ** Посылаем сообщение в браузер о том, что передаём изображение PNG
  47.           */
  48.           header('content-type: image/png');
  49.  
  50.           $figure = imagecreate($fsize,$fsize); // Создаём изображение
  51.  
  52.           /*
  53.           ** Определяем цвет
  54.           */
  55.           switch($fcolor)
  56.             {
  57.               case black:
  58.                 $fcolor = imagecolorallocate($figure,0,0,0);
  59.                 break;
  60.               case blue:
  61.                 $fcolor = imagecolorallocate($figure,0,0,255);
  62.                 break;
  63.               case green:
  64.                 $fcolor = imagecolorallocate($figure,0,255,0);
  65.                 break;
  66.               case red:
  67.                 $fcolor = imagecolorallocate($figure,255,0,0);
  68.                 break;
  69.               case gray:
  70.                 $fcolor = imagecolorallocate($figure,150,150,150);
  71.                 break;
  72.             }
  73.  
  74.           $this->Draw($fsize,$fcolor); // Вызываем функцию рисования фигуры
  75.  
  76.           imagepng($figure); // Выводим
  77.           imagedestroy($figure); // и удаляем изображение
  78.         }
  79.     }
  80.  
  81.   /*
  82.   ** Дочерний класс «Квадрат»
  83.   */
  84.   class Square extends Figure
  85.     {
  86.       function Draw($fsize,$fcolor)
  87.         {
  88.           imageFilledRectangle($figure,0,0,$fsize,$fsize,$fcolor); // Рисуем квадрат
  89.         }
  90.     }
  91.  
  92.   /*
  93.   ** Дочерний класс «Круг»
  94.   */
  95.   class Circle extends Figure
  96.     {
  97.       var $fcenter; // координата центра круга
  98.  
  99.       function Draw($fsize,$fcolor)
  100.         {
  101.           $fcenter = $fsize / 2; // Вычисляем центр круга
  102.           imagearc($figure,$fcenter,$fcenter,$fsize,$fsize,0,360,$fcolor); // Рисуем круг
  103.         }
  104.     }
  105.    
  106.   /*****************************************************************************************************/
  107.  
  108.  
  109.   /*
  110.   ** Записываем переданные параметры в переменные
  111.   */
  112.   $type = $_POST['type'];
  113.   $color = $_POST['color'];
  114.   $size = $_POST['size'];
  115.  
  116.   if($type == 'square') {$obj = new Square();} // В зависимости от типа выбранной фигуры
  117.   elseif($type == 'circle') {$obj = new Circle();} // создаём тот или иной объект
  118.  
  119.   $obj->Show($size,$color); // Рисуем фигуру
  120.  
  121. ?>
 
 Top
OrmaJever Модератор
Отправлено: 04 Июня, 2011 - 10:05:42
Post Id



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


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


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




PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3.   if(!isset($_GET['draw']))
  4.     {
  5.       /*
  6.       ** Если ничего не надо рисовать - выводим форму
  7.       */
  8.       echo '<h1>Наследование и полиморфизм</h1>';
  9.  
  10.       echo '
  11.      <form method="post" action="?draw=1">
  12.      Сторона квадрата / диаметр круга = <input name="size" type="text" size="2" maxlength="2"> пикселей<br>
  13.      Тип фигуры: <select name="type"><option value="square">Квадрат</option>
  14.      <option value="circle">Круг</option></select><br>
  15.      Цвет фигуры: <select name="color"><option value="black">Чёрный</option>
  16.      <option value="blue">Синий</option><option value="red">Красный</option>
  17.      <option value="green">Зелёный</option><option value="gray">Серый</option></select><br>
  18.      <input type="submit" value="Нарисовать">
  19.      </form>
  20.      ';
  21.  
  22.       exit;
  23.     }
  24.  
  25.  
  26.  
  27.   /*
  28.   ** Если надо рисовать - пропускаем форму и выполняем следующее:
  29.   */
  30.  
  31.  
  32.   /***************************************** ОПРЕДЕЛЯЕМ КЛАССЫ *****************************************/
  33.  
  34.   /*
  35.   ** Класс «Фигура»
  36.   */
  37.   class Figure
  38.     {
  39.       var $fcolor; // У переменных в классе «Фигура»
  40.       var $fsize; // в начале имени добавлена буква «f»
  41.       var $figure; // переменная, в которую создаётся изображение - она нужна?
  42.  
  43.       function Show($fsize,$fcolor)
  44.         {
  45.           /*
  46.           ** Посылаем сообщение в браузер о том, что передаём изображение PNG
  47.           */
  48.           header('content-type: image/png');
  49.  
  50.           $this->figure = imagecreate($fsize,$fsize); // Создаём изображение
  51.  
  52.           /*
  53.           ** Определяем цвет
  54.           */
  55.           switch($fcolor)
  56.             {
  57.               case 'black':
  58.                 $fcolor = imagecolorallocate($this->figure,0,0,0);
  59.                 break;
  60.               case 'blue':
  61.                 $fcolor = imagecolorallocate($this->figure,0,0,255);
  62.                 break;
  63.               case 'green':
  64.                 $fcolor = imagecolorallocate($this->figure,0,255,0);
  65.                 break;
  66.               case 'red':
  67.                 $fcolor = imagecolorallocate($this->figure,255,0,0);
  68.                 break;
  69.               case 'gray':
  70.                 $fcolor = imagecolorallocate($this->figure,150,150,150);
  71.                 break;
  72.             }
  73.  
  74.           $this->Draw($fsize,$fcolor); // Вызываем функцию рисования фигуры
  75.  
  76.           imagepng($this->figure); // Выводим
  77.           imagedestroy($this->figure); // и удаляем изображение
  78.         }
  79.     }
  80.  
  81.   /*
  82.   ** Дочерний класс «Квадрат»
  83.   */
  84.   class Square extends Figure
  85.     {
  86.       function Draw($fsize,$fcolor)
  87.         {
  88.           imageFilledRectangle($this->figure,0,0,$fsize,$fsize,$fcolor); // Рисуем квадрат
  89.         }
  90.     }
  91.  
  92.   /*
  93.   ** Дочерний класс «Круг»
  94.   */
  95.   class Circle extends Figure
  96.     {
  97.       var $fcenter; // координата центра круга
  98.  
  99.       function Draw($fsize,$fcolor)
  100.         {
  101.           $fcenter = $fsize / 2; // Вычисляем центр круга
  102.           imagearc($this->figure,$fcenter,$fcenter,$fsize,$fsize,0,360,$fcolor); // Рисуем круг
  103.         }
  104.     }
  105.  
  106.   /*****************************************************************************************************/
  107.  
  108.  
  109.   /*
  110.   ** Записываем переданные параметры в переменные
  111.   */
  112.   $type = $_POST['type'];
  113.   $color = $_POST['color'];
  114.   $size = $_POST['size'];
  115.  
  116.   if($type == 'square') {$obj = new Square();} // В зависимости от типа выбранной фигуры
  117.   elseif($type == 'circle') {$obj = new Circle();} // создаём тот или иной объект
  118.  
  119.   $obj->Show($size,$color); // Рисуем фигуру
  120.  
  121. ?>

(Отредактировано автором: 04 Июня, 2011 - 10:13:26)



-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
djar
Отправлено: 04 Июня, 2011 - 11:01:15
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Июнь 2011  


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




Спасибо. Это потому что я не передаю переменную $figure в функцию, и чтобы работать ней, нужно брать её прямиком из класса посредством $this->, да?
 
 Top
OrmaJever Модератор
Отправлено: 04 Июня, 2011 - 12:10:27
Post Id



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


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


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




ещё у вас было так
case black:
а нужно так
case 'black':
и выскакивал Notice о несуществующей константе и ломал изображение


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Stierus Супермодератор
Отправлено: 04 Июня, 2011 - 19:30:59
Post Id



Рекордсмен по количеству сообщений за 7 дней


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


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




из замечаний, не влияющий в данный момент на работоспособность:
class Figure должен быть абстратным, т.к. использует ф-и, которые не описаны непосредственно в нем, но обязательно описываемые в чайлдах.
 
My status
 Top
djar
Отправлено: 05 Июня, 2011 - 00:44:13
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Июнь 2011  


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




Stierus, спасибо за замечание, почитал, что это такое)
Можете ответить на тот вопрос, что я задавал выше - почему нужно к перемнной $figure обращаться с помощью $this->figure?
И ещё, я исправил класс «Круг», теперь он выглядит так:
PHP:
скопировать код в буфер обмена
  1.      /*
  2.      ** Дочерний класс «Круг»
  3.      */
  4.      class Circle extends Figure
  5.           {
  6.                var $fcenter; // Координата центра круга
  7.  
  8.                function Draw($fsize,$fcolor)
  9.                     {
  10.                          $fcenter = $fsize / 2; // Вычисляем центр круга
  11.                          $white = imagecolorallocate($this->figure,255,255,255);
  12.                          imagefill($this->figure,0,0,$white); // Заливаем фон рисунка белым
  13.                          imageellipse($this->figure,$fcenter,$fcenter,$fsize,$fsize,$fcolor); // Рисуем окружность
  14.                          imagefill($this->figure,$fcenter,$fcenter,$fcolor); // Заливаем окружность выбранным цветом
  15.                     }
  16.           }

Тут есть переменная $white, я забыл её объявить как свойство класса, но всё отлично работает и так. Всегда ли нужно объявлять свойства? Почему у меня работает код? И наверное уже правильнее использовать private, public и protected вместо var?

И ещё, вот текст задания лабораторной:
Цитата:
Реализовать объект "фигура" и производные от него объекты "круг" и "квадрат". Реализовать для всех них виртуальный метод Show - рисование соответствующей фигуры.

У меня здесь метод Show получился виртуальным? Улыбка

(Отредактировано автором: 05 Июня, 2011 - 00:48:44)

 
 Top
OrmaJever Модератор
Отправлено: 05 Июня, 2011 - 01:21:48
Post Id



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


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


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




djar пишет:
почему нужно к перемнной $figure обращаться с помощью $this->figure?

потому что ко всем свойствам объекта нужно обращатся через $this, иначе это другая переменая
(Добавление)
djar пишет:
Тут есть переменная $white, я забыл её объявить как свойство класса, но всё отлично работает и так. Всегда ли нужно объявлять свойства? Почему у меня работает код?

$white у вас не свойство класа, а просто переменая как в обычной функции.
djar пишет:
И наверное уже правильнее использовать private, public и protected вместо var?

Да ключевое слово var уже устарело. Так же методы класа тоже нужно обьвлять как private, public и protected


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 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