Показать полную графическую версию : [решено] Начало работы с ООП. Вопросы, возникающие на практике
Artem-Samsung
05-02-2010, 23:28
Про ООП читал. Читал много.
Примеры просматривал, и со всем соглашался, все ясно.
Но начал создавать что то сам, и получается ошибка:
Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION
То, что я пытался сочинить приводить не буду, там нудно и не интересно.
Приведу в простом примере:
<?
class Webpage {
var $bgcolor;
function test($color) {
return $color;
}
$this->bgcolor = test("Brown");
}
// Вызвать конструктор класса Webpage
$page = new Webpage;
echo $page->bgcolor;
?>
т.е. внутри класса создаю функцию, и в самом класе изменить значение обьекта.
Почему так нельзя? Обьясните пожалуйста, если можно.
Спасибо
$this->test() (this и к методу тоже).
внутри класса создаю функцию »
это уже метод...// Вызвать конструктор класса Webpage »
экземпляр, ибо конструктор - метод с именем класса (или __construct в PHP5)
изучайте ООП в PHP5+, оно более продвинуто в сравнении с ООП PHP4-
мануалы по ООП: PHP4 (http://docs.php.net/manual/ru/language.oop.php), PHP5 (http://docs.php.net/manual/ru/language.oop5.php).
Artem-Samsung
06-02-2010, 01:15
Спасибо, таки да, это метод.
тогда я выношу функцию
function test($color) {
return $color;
}
class Webpage {
var $bgcolor;
$this->bgcolor = test("Brown");
}
$page = new Webpage;
echo $page->bgcolor;
?>
Так она тоже не работает?
Не работает, потому что операции с переменными/свойствами внутри класса должны выполняться только в теле методов. В вашем случае можно засунуть строку в метод-конструктор Webpage.
<?php
class Webpage {
var $bgcolor;
function Webpage() {
$this->bgcolor = $this->test("Brown");
}
function test($color) {
return $color;
}
}
$page = new Webpage;
echo $page->bgcolor;
?>
Artem-Samsung
08-02-2010, 23:13
подскажите, что не так. как сделать лучше?
<?php
class de_captcha {
var $captcha = "1234";
var $bg = "captcha.jpg";
var $R = 0; var $G = 0; var $B = 0;
var $h1 = 5; var $h2 = 35;
var $v1 = 17; var $v2 = 23;
var $im; var $color; var $hor; var $vert;
function generate_image() {
$this->im = ImageCreateFromJPEG ($this->bg);
$this->color = imagecolorallocate($this->im, $this->R, $this->G, $this->B);
$this->hor = rand($this->h1,$this->h2);
$this->vert = rand($this->h1,$this->h2);
imagettftext($this->im, 12, 0, $this->hor, $this->vert, $this->color,
"/web/sites/godlight.kiev.ua/advertmf.ttf", $this->captcha);
imagejpeg($this->im, NULL, 100);
imagedestroy($this->im);
}
}
?>
<?php
session_start();
include '../lib/class.captcha.php';
$_SESSION['captcha'] = rand(100,999);
$a = new de_captcha();
$a->captcha = $_SESSION['captcha'];
$a->generate_image();
?>
Это я обычный свой модуль хочу попробовать в классы перевести.
$_SESSION['captcha'] = rand(100,999);
header("Content-type: image/jpeg");
$im = ImageCreateFromJPEG ("captcha.jpg");
$color = imagecolorallocate($im, 118, 138, 130);
$hor = rand(5,35);
$vert = rand(17,23);
imagettftext($im, 12, 0, $hor, $vert, $color, "advertmf.ttf", $_SESSION['captcha']);
imagejpeg($im, NULL, 100);
imagedestroy($im);
текст на картинке не отображается
Зачем столько public-свойств, если внешне они не нужны? Используйте обычные переменные по возможности.екст на картинке не отображается »
имхо смотрите файл шрифта, путь или шрифт... скопируйте arial.ttf в папку скрипта и укажите просто "arial.ttf". Также смотрите, чтобы ничего лишнего не выводилось.
header("Content-type: image/jpeg"); »
заголовок тоже не забудьте
Artem-Samsung
10-02-2010, 12:55
С текстом я разобрался, забыл написать, да дело было со шрифтом.
Переменные паблик для того, что я мог при возможности задавать новые свойства для каптчи, если понадобится.
вот только можно избавиться разве что от
var $h1 = 5; var $h2 = 35;
var $v1 = 17; var $v2 = 23;
если решу вопрос в соседней теме)
Artem-Samsung
10-02-2010, 17:30
Вот как я красивенько сделал :
<?php
class de_captcha {
var $captcha;
var $bg;
var $size;
var $color;
var $font;
function __construct($captcha, $bg, $size, $color, $font) {
$this->captcha = $captcha;
$this->bg = $bg;
$this->size = $size;
$this->color = $color;
$this->font = $font;
}
function generate_image() {
$im = ImageCreateFromJPEG ($this->bg);
$color = explode(",", $this->color);
$color = imagecolorallocate($im, trim($color[0]), trim($color[1]), trim($color[2]));
$font_size = imagettfbbox ($this->size , 0 , $this->font , $this->captcha);
$height = abs($font_size[1]) + abs($font_size[7]);
$width = abs($font_size[0]) + abs($font_size[2]);
$imgwidth = imagesx($im);
$imgheight = imagesy($im);
$x1 = 3; $x2 = $imgwidth-$width-2;
$y1 = $height; $y2 = $imgheight-2;
$x = rand($x1,$x2);
$y = rand($y1,$y2);
imagettftext($im, $this->size, 0, $x, $y, $color, $this->font, $this->captcha);
imagejpeg($im, NULL, 100);
imagedestroy($im);
}
}
?>
:girlinlove:
http://godlight.kiev.ua/captcha.jpg (http://godlight.kiev.ua/captcha.jpg)
Запускается клас так:
<?php
header("Content-type: image/jpeg");
session_start();
include '../lib/class.captcha.php';
$_SESSION['captcha'] = rand (100, 999);
$a = new de_captcha($_SESSION['captcha'], "captcha/captcha.jpg", 12, "83,115,174", "captcha/advertmf.ttf");
$a->generate_image();
?>
function __construct »
не смешивайте ооп php4 и 5. В PHP5 вместо var используется public/private/protected.
__construct - это в php5, в 4 метод-конструктор с именем класса. Лучше сразу все оформить в стиле php5.
Artem-Samsung
10-02-2010, 20:55
не смешивайте ооп php4 и 5. В PHP5 вместо var используется public/private/protected.
__construct - это в php5, в 4 метод-конструктор с именем класса. Лучше сразу все оформить в стиле php5. »
Спасибо большое. Буду править.
Artem-Samsung
10-02-2010, 23:29
Исправил, добавил комментерии.
Sham, уделите пожалуйста минутку и прочтите комментарии, я правильно формулирую текст, комментарии?
<?php
class de_captcha {
// Объявляем свойства класса
public $captcha;
public $bg;
public $size;
public $color;
public $font;
// Конструктор класса de_captcha
function __construct($captcha, $bg, $size, $color, $font) {
$this->captcha = $captcha;
$this->bg = $bg;
$this->size = $size;
$this->color = $color;
$this->font = $font;
}
// Метод, который создает изображение
function generate_image() {
$im = ImageCreateFromJPEG ($this->bg);
// Вычленяем из свойства color RGB
$color = explode(",", $this->color);
$color = imagecolorallocate($im, trim($color[0]), trim($color[1]), trim($color[2]));
// Определяем размер текстового блока. Ширину и высоту.
$font_size = imagettfbbox ($this->size , 0 , $this->font , $this->captcha);
$height = abs($font_size[1]) + abs($font_size[7]);
$width = abs($font_size[0]) + abs($font_size[2]);
// Определяем размер всей каптчи, по заданому фону.
$imgwidth = imagesx($im);
$imgheight = imagesy($im);
// Координаты XY, в диапазоне которых будет появляться текстовый элемент
$x1 = 3; $x2 = $imgwidth-$width-2;
$y1 = $height; $y2 = $imgheight-2;
$x = rand($x1,$x2);
$y = rand($y1,$y2);
// Накладываем текстовый блок на фон
imagettftext($im, $this->size, 0, $x, $y, $color, $this->font, $this->captcha);
// Выводим изображение в выходной поток браузера
imagejpeg($im, NULL, 100);
// Освобождает память, занятую изображением
imagedestroy($im);
}
}
?>
<?php
header("Content-type: image/jpeg");
session_start();
// Подключение файл класса
include '../lib/class.captcha.php';
$_SESSION['captcha'] = rand (100, 999);
// Создание объекта
$a = new de_captcha($_SESSION['captcha'], "captcha/captcha.jpg", 12, "83,115,174", "captcha/advertmf.ttf");
// Подключаем метод
$a->generate_image();
?>
$im = ImageCreateFromJPEG ($this->bg); »
imagecreatefromjpeg (http://docs.php.net/manual/ru/function.imagecreatefromjpeg.php) вроде в нижнем регистре пишется, хотя и так работает, но лучше по мануалу...
Content-type: »
Content-Type: регистр таки важен...
комментарии понятны
вообще, комментарии к классам, методам, функциям и т.д. оформляются в виде
/**
* описание
*
* @author Artem-Samsung <xxx@xxx.xx>
* @version 1.0.0
* @copyright (c) 2010 Artem-Samsung
* @package капча
* @example example.php и т.д.
*/
это какой-то негласный стандарт оформления...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC