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 :: Версия для печати :: Классы для рисования квадрата и круга
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Классы для рисования квадрата и круга

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

1. djar - 04 Июня, 2011 - 09:19:10 - перейти к сообщению
Только начал изучать ООП. Делаю лабораторную работу.
Нужно создать класс «Фигура», от него два дочерних - «Круг» и «Квадрат». Ну и вывести выбранную фигуру в браузер.

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

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. ?>
2. OrmaJever - 04 Июня, 2011 - 10:05:42 - перейти к сообщению
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. ?>
3. djar - 04 Июня, 2011 - 11:01:15 - перейти к сообщению
Спасибо. Это потому что я не передаю переменную $figure в функцию, и чтобы работать ней, нужно брать её прямиком из класса посредством $this->, да?
4. OrmaJever - 04 Июня, 2011 - 12:10:27 - перейти к сообщению
ещё у вас было так
case black:
а нужно так
case 'black':
и выскакивал Notice о несуществующей константе и ломал изображение
5. Stierus - 04 Июня, 2011 - 19:30:59 - перейти к сообщению
из замечаний, не влияющий в данный момент на работоспособность:
class Figure должен быть абстратным, т.к. использует ф-и, которые не описаны непосредственно в нем, но обязательно описываемые в чайлдах.
6. djar - 05 Июня, 2011 - 00:44:13 - перейти к сообщению
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 получился виртуальным? Улыбка
7. OrmaJever - 05 Июня, 2011 - 01:21:48 - перейти к сообщению
djar пишет:
почему нужно к перемнной $figure обращаться с помощью $this->figure?

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

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

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

 

Powered by ExBB FM 1.0 RC1