Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   [решено] Начало работы с ООП. Вопросы, возникающие на практике (http://forum.oszone.net/showthread.php?t=166438)

Artem-Samsung 05-02-2010 23:28 1340157

Начало работы с ООП. Вопросы, возникающие на практике
 
Про ООП читал. Читал много.
Примеры просматривал, и со всем соглашался, все ясно.

Но начал создавать что то сам, и получается ошибка:
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;
?>

т.е. внутри класса создаю функцию, и в самом класе изменить значение обьекта.
Почему так нельзя? Обьясните пожалуйста, если можно.

Спасибо

Sham 05-02-2010 23:52 1340170

$this->test() (this и к методу тоже).
Цитата:

Цитата Artem-Samsung
внутри класса создаю функцию »

это уже метод...
Цитата:

Цитата Artem-Samsung
// Вызвать конструктор класса Webpage »

экземпляр, ибо конструктор - метод с именем класса (или __construct в PHP5)

изучайте ООП в PHP5+, оно более продвинуто в сравнении с ООП PHP4-

мануалы по ООП: PHP4, PHP5.

Artem-Samsung 06-02-2010 01:15 1340225

Спасибо, таки да, это метод.
тогда я выношу функцию

Код:

function test($color) {
 return $color;
}
class Webpage {
var $bgcolor;
 $this->bgcolor = test("Brown");
}

$page = new Webpage;
echo $page->bgcolor;
?>

Так она тоже не работает?

Sham 06-02-2010 02:54 1340284

Не работает, потому что операции с переменными/свойствами внутри класса должны выполняться только в теле методов. В вашем случае можно засунуть строку в метод-конструктор Webpage.

PHP код:

<?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 1342544

подскажите, что не так. как сделать лучше?

PHP код:

<?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->im120$this->hor$this->vert$this->color
            
"/web/sites/godlight.kiev.ua/advertmf.ttf",  $this->captcha);
        
imagejpeg($this->imNULL100);
        
imagedestroy($this->im);
    }
}
?>

PHP код:

<?php

session_start
();
include 
'../lib/class.captcha.php';
$_SESSION['captcha'] = rand(100,999);

$a = new de_captcha();
$a->captcha $_SESSION['captcha'];
$a->generate_image();

?>

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

$_SESSION['captcha'] = rand(100,999);
header("Content-type: image/jpeg");
$im ImageCreateFromJPEG ("captcha.jpg");
$color imagecolorallocate($im118138130);

$hor rand(5,35);
$vert rand(17,23);
imagettftext($im120$hor$vert$color"advertmf.ttf",  $_SESSION['captcha']);
imagejpeg($imNULL100);
imagedestroy($im); 

текст на картинке не отображается

Sham 10-02-2010 04:51 1343586

Зачем столько public-свойств, если внешне они не нужны? Используйте обычные переменные по возможности.
Цитата:

Цитата Artem-Samsung
екст на картинке не отображается »

имхо смотрите файл шрифта, путь или шрифт... скопируйте arial.ttf в папку скрипта и укажите просто "arial.ttf". Также смотрите, чтобы ничего лишнего не выводилось.

Цитата:

Цитата Artem-Samsung
header("Content-type: image/jpeg"); »

заголовок тоже не забудьте

Artem-Samsung 10-02-2010 12:55 1343779

С текстом я разобрался, забыл написать, да дело было со шрифтом.
Переменные паблик для того, что я мог при возможности задавать новые свойства для каптчи, если понадобится.
вот только можно избавиться разве что от

var $h1 = 5; var $h2 = 35;
var $v1 = 17; var $v2 = 23;

если решу вопрос в соседней теме)

Artem-Samsung 10-02-2010 17:30 1344025

Вот как я красивенько сделал :

PHP код:

<?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($imtrim($color[0]), trim($color[1]), trim($color[2]));
        
$font_size imagettfbbox ($this->size $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->size0$x$y$color$this->font$this->captcha);
        
imagejpeg($imNULL100);
        
imagedestroy($im);
    }
}
?>

:girlinlove:



Запускается клас так:

PHP код:

<?php
header
("Content-type: image/jpeg");
session_start();
include 
'../lib/class.captcha.php';
$_SESSION['captcha'] = rand (100999);
$a = new de_captcha($_SESSION['captcha'], "captcha/captcha.jpg"12"83,115,174""captcha/advertmf.ttf");
$a->generate_image();
?>


Sham 10-02-2010 20:53 1344161

Цитата:

Цитата Artem-Samsung
function __construct »

не смешивайте ооп php4 и 5. В PHP5 вместо var используется public/private/protected.
__construct - это в php5, в 4 метод-конструктор с именем класса. Лучше сразу все оформить в стиле php5.

Artem-Samsung 10-02-2010 20:55 1344163

Цитата:

Цитата Sham
не смешивайте ооп php4 и 5. В PHP5 вместо var используется public/private/protected.
__construct - это в php5, в 4 метод-конструктор с именем класса. Лучше сразу все оформить в стиле php5. »

Спасибо большое. Буду править.

Artem-Samsung 10-02-2010 23:29 1344270

Исправил, добавил комментерии.
Sham, уделите пожалуйста минутку и прочтите комментарии, я правильно формулирую текст, комментарии?

PHP код:

<?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($imtrim($color[0]), trim($color[1]), trim($color[2]));
        
        
// Определяем размер текстового блока. Ширину и высоту.
        
$font_size imagettfbbox ($this->size $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->size0$x$y$color$this->font$this->captcha);
        
        
// Выводим изображение в выходной поток браузера
        
imagejpeg($imNULL100);
        
// Освобождает память, занятую изображением
        
imagedestroy($im);
    }
}
?>

PHP код:

<?php
header
("Content-type: image/jpeg");
session_start();

// Подключение файл класса
include '../lib/class.captcha.php';
$_SESSION['captcha'] = rand (100999);

// Создание объекта
$a = new de_captcha($_SESSION['captcha'], "captcha/captcha.jpg"12"83,115,174""captcha/advertmf.ttf");
// Подключаем метод
$a->generate_image();
?>


Sham 11-02-2010 00:18 1344304

Цитата:

Цитата Artem-Samsung
$im = ImageCreateFromJPEG ($this->bg); »

imagecreatefromjpeg вроде в нижнем регистре пишется, хотя и так работает, но лучше по мануалу...
Цитата:

Цитата Artem-Samsung
Content-type: »

Content-Type: регистр таки важен...

комментарии понятны

вообще, комментарии к классам, методам, функциям и т.д. оформляются в виде

PHP код:

/**
 *  описание
 *
 *  @author     Artem-Samsung <xxx@xxx.xx>
 *  @version    1.0.0
 *  @copyright  (c) 2010 Artem-Samsung
 *  @package    капча
 *  @example    example.php и т.д.
 */ 

это какой-то негласный стандарт оформления...


Время: 03:23.

Время: 03:23.
© OSzone.net 2001-2025