[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: помогите разобраться с ООП
reboot
я возненавидил ООП с тех пор, когда в универе читали C#, так ни одной проги за год самостоятльно не написал. Не по собственному желанию надо познать ООР на РНР...

направьте, пожалуйста, на путь истинный.

вот выжимка моего исходника, который не позволяет проходить ссылки со скоростью больше 3 в 2 секунды
PHP
<?
    session_start();
    if (empty($_SESSION['count']))
    {
        $_SESSION['count'] = 1;
        $_SESSION['ltime'] = date('s');
    }
    else
    
{
        $_SESSION['count']++;
        if (($_SESSION['count']%2) !=  0)
        {
            $_SESSION['ltime'] = $_SESSION['ntime'];
        }
        $_SESSION['ntime'] = date('s');
    
        if 
((intval($_SESSION['ntime']) - intval($_SESSION['ltime'])) == 0)
        {
            echo "сильно палевно кликать так часто на ссылки";
        }
        else
        
{
            echo "захади, дарагой!";
        }
    }


как написать класс, который делает все тоже самое???

после 3 строчек кода я повис и не знаю что писать дальше....

PHP
<?
    class AntiBot 
    
{
        private $time; //не уверен в этом
        
        function GetTime
() //получаем секунды
        {
            return $time=intval(date("s"));
        }
        
        function Razn
($first, $second) //вычисление разности между 2 отрезками времени
        {
            if (($first - $second) == 0)
            {
                return false;
            }
            else
            
{
                return true;
            }
        }        
    
}


не могу понять что писать дальше! то ли в конструкторе надо начать сессию, то ли создать функцию? и как дальше все сделать?
если у кого-то есть желание, помогите, разобраться.



Спустя 21 минута, 47 секунд (2.08.2009 - 16:25) jetistyum написал(а):
Ну вообще честно говоря сложно учить человека, который не хочет учиться (
в конструкторе сессию не нужно стартовать, антибот есть антибот, он не должен заниматься инициализацией сессии.

PHP
class antibot {
 private 
$session null;
 private 
$maxtime  null;
public function 
__construct($maxTimeAllowed =3, &$session=null ){
    
$this->maxtime $maxtimeallowed;
 if (
$session !=null)
   
$this->session $session;
 elseif (isset(
$_SESSION))
  
$this->session = &$_SESSION['__antibot__'];

  else 
       throw new 
Exception('Session must be initialized before initializing antibot');
   
   if (empty(
$this->session['lastrun'])
       
$this->session['lastrun'] = time();

}

public function 
check(){
    if ( (
time() - $this->session['lastrun'])>$this->maxtimeallowed)
    {
        
$this->session['lastrun'] = time();
        return 
true;
    }
    return 
false;

}
}


вот может как-то так.. подумай какой функционал тебе еще нужен, дополни....

Спустя 21 минута, 56 секунд (2.08.2009 - 16:47) FatCat написал(а):
Замечу мимоходом:

Цитата (reboot @ 2.08.2009 - 17:04)
function GetTime() //получаем секунды
{
return $time=intval(date("s"));
}

PHP
time()

Спустя 1 час, 58 минут, 12 секунд (2.08.2009 - 18:46) reboot написал(а):
jetistyum, спасибо за исходник! он полностью подходит, только есть одно НО... я хочу научится сам создавать/использовать классы/объекты

можете объяснить глобальное значение $this? в упор не понимаю зачем оно нужно, ведь можно (чет мне так кажется) и без него обойтись


Спустя 3 минуты, 11 секунд (2.08.2009 - 18:49) twin написал(а):
Это значит "здесь". То есть так $var будет просто переменная, которая видна только в функции (методе), а так $this->var эта переменная видна везде в пределах класса. То есть какм бы локальная константа.

Спустя 17 минут, 32 секунды (2.08.2009 - 19:06) reboot написал(а):
ок, спасибо, понятно!
а еще тако

Спустя 1 минута, 30 секунд (2.08.2009 - 19:08) jetistyum написал(а):
ну почитай книжки, нам на форуме будет неудобно объяснять тебе принципы ООП что такое класс, как с ним работать можешь почитать тут
http://ua.php.net/manual/en/language.oop5.basic.php

а $this это обращение к не статическому свойству или методу объекта. вот чтобы это все понять, тебе нужно почитать книженции, коих навалом и в магазинах и в интернетах

Спустя 12 минут, 29 секунд (2.08.2009 - 19:20) reboot написал(а):
ок, спасибо, понятно!

А еще такой вопрос - на сколько надо "дробить" код на функции/методы?
к примеру, если ли смысл отдельно создавать функцию, которая возвращеет кол-во секунд?
PHP
function GetTime()
        {
            return 
$this->$time=time();
        }

Нам препод рассказывал что дробить надо как можно лучше, - в больших проектах будет удобнее.

Сайты делаю с использование смарти, но не тупо как шаблонизатор, а чуть более гибкий подход избрал:
PHP
<?php

class Catalog
{   
    function 
Catalog ()
       {
       
       }
    
    function 
add()
    {        
                    
    }    
    
    function 
adddb()
    {            
        
    }
    
    function 
show()
    {
            
    }
    
    function 
left()
    {
            
    }
    
    function 
right()
    {
        
    }
}


т.е. на каждую разную функциональную часть сайта создается отдельный класс, НО в функциях пишу обычным РНР'шным кодом, и разобраться можно и через год понятно что за что отвечает.

Как найболее оптимально разбивать код в ООП на функции?????

---------------------

и вопрос номер2:
Какая разница между?
PHP
function GetTime()
        {
            return 
$this->$time=time();
        }

и
PHP
function GetTime()
        {
            return 
$time=time();
        }



jetistyum, да читал я тот мануал, и не только тот.
долго е*ался с C# в универе, теорию знаю, мог нормально с преподом на эту тему говорить, а вот написать что-то с ООП это жесть!

Спустя 17 минут, 46 секунд (2.08.2009 - 19:38) twin написал(а):
Цитата
Как найболее оптимально разбивать код в ООП на функции?????

В ООП нет функций. Там методы. Потому что класс, это не набор функций а объект, тип данных. А как разбивать, это от фантазии разработчика только зависит.
Цитата
Какая разница между?

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

Спустя 1 час, 8 минут, 51 секунда (2.08.2009 - 20:47) Sylex написал(а):
Цитата (reboot @ 2.08.2009 - 22:20)
$this->$time


$this->time

Спустя 1 минута, 5 секунд (2.08.2009 - 20:48) Sylex написал(а):
reboot
найди хорошую книжку про ООП, и почитай

Спустя 9 минут, 50 секунд (2.08.2009 - 20:58) Oyeme написал(а):
Цитата (reboot @ 2.08.2009 - 16:20)
и вопрос номер2:
Какая разница между?
PHP
function GetTime()
        {
            return $this->$time=time();
        }

и
PHP
function GetTime()
        {
            return $time=time();
        }



jetistyum, да читал я тот мануал, и не только тот.
долго е*ался с C# в универе, теорию знаю, мог нормально с преподом на эту тему говорить, а вот написать что-то с ООП это жесть!

В первом случаи ты возражаешь обрабатываемый результат.

Во втором случаи ты присваиваешь переменную которaя была инициализированную в начале класса.
В дальнейшем весь класс может с ней работать,обращаясь через $this

Спустя 38 минут, 15 секунд (2.08.2009 - 21:36) reboot написал(а):
Цитата (Sylex @ 2.08.2009 - 17:48)
reboot
найди хорошую книжку про ООП, и почитай

а можете конкретно автора посоветовать? сейчас книг как собак не резанных, и не мало с них Г

Спустя 13 минут, 9 секунд (2.08.2009 - 21:49) jetistyum написал(а):
я когда-то читал Котерова, дальше учился на примерах.. статей в интернете.
главное только не Попова, остальное все покатит smile.gif

Спустя 8 минут, 6 секунд (2.08.2009 - 21:57) Sylex написал(а):
Цитата (jetistyum @ 3.08.2009 - 00:49)
главное только не Попова

biggrin.gif

Цитата (reboot @ 3.08.2009 - 00:36)
а можете конкретно автора посоветовать?


Гради Буч


Спустя 39 минут, 55 секунд (2.08.2009 - 22:37) Krevedko написал(а):
Попов про ООП наверное и сам не знает smile.gif

Спустя 1 час, 36 минут, 29 секунд (3.08.2009 - 00:14) reboot написал(а):
примеры это хорошо, если есть хорошие)
читал статьи на http://www.php.su/learnphp/phpoo/?classes - ни одного слова для чего надо $this и почему нету.... и это не единственный пример г*вно-материала.
за книжечку спасибо, ща качну!

Спустя 27 минут, 21 секунда (3.08.2009 - 00:41) jetistyum написал(а):
Цитата (reboot @ 3.08.2009 - 00:14)
читал статьи на http://www.php.su/learnphp/phpoo/?classes - ни одного слова для чего надо $this и почему нету.... и это не единственный пример г*вно-материала.

Вместо того, чтобы говорить "говноматериал", лучше бы читал внимательнее, или у тебя не хватило терпения дочитать до строк:
Цитата
Чтобы получить доступ к членам класса внутри класса, необходимо использовать указатель $this, которы всегда относится к текущему объекту.

Тогда никакие книжки не спасут.

Спустя 7 часов, 32 минуты, 7 секунд (3.08.2009 - 08:13) Dezigo написал(а):
не стоит делать тупо функцию в методе, если функция и так проста.
это не корректно. ph34r.gif
и не надо пихать ооп куда угодно. для каждого свой подход.

Спустя 1 день, 2 часа, 36 минут, 6 секунд (4.08.2009 - 10:49) glock18 написал(а):
ООП это не просто
Цитата
напихать функции в классы и поменять везде вызовы функций на вызовы методов
основы ООП надо учить, и применять нужно их, а не просто (читай выше)

Спустя 7 дней, 3 часа, 26 минут, 38 секунд (11.08.2009 - 14:16) devsten написал(а):
Самый лучший способ понять ООП - выучить любой ООП язык . Можно Java , C# , Smalltalk. В твоём случае как раз C#, так как вы его проходили, то есть, по логике, будет легче. Поняв ООП в С# (например), понять его на любом другом языке и быстро вникнуть в особенности , не составит труда, гарантирую!=) Принцип везде одинаковый.

Спустя 5 часов, 21 минута, 39 секунд (11.08.2009 - 19:38) Krevedko написал(а):
не могу понять..помогите sad.gif

Спустя 29 минут, 20 секунд (11.08.2009 - 20:07) kirik написал(а):
Цитата (Krevedko @ 11.08.2009 - 11:38)
не могу понять..помогите

"Спасение утопающих дело рук самих утопающих" wink.gif

Спустя 36 минут, 12 секунд (11.08.2009 - 20:43) twin написал(а):
Цитата
ООП это не просто Цитата
напихать функции в классы и поменять везде вызовы функций на вызовы методов

основы ООП надо учить, и применять нужно их, а не просто (читай выше)

Не слушай, ща напугают досмерти))))
Все просто. Вот говорят - класс, это не набор функций, это огого!!!
А на самом деле очень многие, да почти все, именно так и начинают это воспринимать. Потом уже приходит более глубокое понимание. А начать надо с простого.
Вот простой код.
PHP
$var = 'Привет, Мир!';
    echo $var;

Вот более продвинутый:
PHP
function hello_world()
    {
    return 'Привет, Мир!';
    }

    echo hello_world();

А вот ваще крутой:
PHP
class Hello
    
{
        function hello_world()
        {
        return 'Привет, Мир!';
        }        

    
}
    
    $helo 
= new Hello();
    echo $helo -> hello_world();

Теперь малость усложним задачу.

PHP
class Hello
    
{
    
    private $who 
= 'Мир!';
    
        function hello_world
()
        {
        return 'Привет, '. $this->who;
        }        

    
}

То есть мы определили переменную, котрую видно внутри класса. Что бы к ней обратиться внутри метода (по русски функции), вместо $ надо приляпать такую штуковину $this->
Теперь еще дальше. Делаем второй метод.
PHP
class Hello
    
{
    
    private $who 
= 'Мир!';
    
        function hello_world
()
        {
        return 'Привет, '. $this->who;
        }
                
        function my_name
($name)
        {
        return 'Йа - '. $name;
        }
    }
    
    $helo 
= new Hello();
    echo $helo -> hello_world();
    echo $helo -> my_name('Krevedko');


И дальше, что бы можно было сразу тебя узнать:

PHP
class Hello
    
{
    
    private $who 
= 'Мир!';
    private $name = 'Krevedko';    
    
        function __construct
($who = false)
        {
            if($who)
            $this->who = $who;
        }
    
        function hello_world
()
        {
        return 'Привет, '. $this->who;
        }
                
        function my_name
($name = false)
        {
            if($name)
            return 'Йа - '. $name;
            else
            return 
'Йа - '. $this->name;
        }
    }
    
    $helo 
= new Hello();
    echo $helo -> hello_world();
    echo $helo -> my_name();

или допустим другое имя поставить:

PHP
$helo = new Hello('<?php');
    echo $helo -> hello_world();
    echo $helo -> my_name( 'Криведко');

Потому что вот это:
PHP
function __construct()

срабатывает всегда, когда запускается класс (создается новый объект). И значения можно передать в класс прямо при создании объекта. ($helo = new Hello('<?php');) А можно не передавать ничего, а прямо там что то сделать. Главное, что он сработает не звисимо от.

Ну а дальше учёбник, наследование, полиформизм и прочая муть.

Спустя 6 дней, 20 часов, 50 минут, 45 секунд (18.08.2009 - 17:34) Krevedko написал(а):
Николай, когда это писал, определенно думал обо мне biggrin.gif

Спустя 29 минут, 57 секунд (18.08.2009 - 18:04) twin написал(а):
Цитата
не могу понять..помогите

Это разве не твои слова? Не просто о тебе думал, а для тебя писал)))

Спустя 15 минут, 41 секунда (18.08.2009 - 18:19) Krevedko написал(а):
дадада ! Спасибо. Можно еще подобный пример ?

Спустя 2 дня, 19 часов, 7 минут, 58 секунд (21.08.2009 - 13:27) DenPHP написал(а):
хотел написать что тебе не понятного...но потом вспомнил что я сам со вчера изучаю ПХП решил написать кодик. и как оказалось не чего сложного...кроме вопроса...
коструктор всегда __construct ?

PHP
<?php

class Hello
    
{
    
    private 
$name;  
    private 
$age;    
    
        function 
__construct($name false$age false)
        {
            if(
$name){
        
$this->name $name;
        }
         else if (
$age){
        
$this->age $age;
        }
        }
    
        function 
setName($name)
        {
        
$this->name $name;
        }
    function 
setAge($age)
        {
        
$this->age $age;
        }
        function 
getName()
        {
        return 
$this->name;
        }     
    function 
getAge()
        {
        return 
$this->age;
        }
        function 
show_player()
        {
        echo 
"</br>";
        echo 
$this->name;
        echo 
$this->age;
        }
    }
    
    
$player = new Hello();
    
$player -> setName("Denis");
    
$player -> setAge("19");
    echo 
$player -> getName();
    echo 
$player -> getAge();
    
$player -> show_player();





Спустя 29 минут, 57 секунд (21.08.2009 - 13:57) Michael написал(а):
Цитата
коструктор всегда __construct ?

Да, конструктор всегда __construct. Можно задавать несколько с разным количеством параметров. Твой кстати некорректен:
PHP
function __construct($name false$age false)
 {
    if(
$name){
    
$this->name $name;
    }
    else if(
$age){
    
$this->age $age;
    }
}

Если указать и name и age, то установится только name - поменяй else if на if
и в начале
PHP
private $name='';  
    private 
$age=0;

Спустя 56 минут, 51 секунда (21.08.2009 - 14:54) glock18 написал(а):
Цитата (Michael @ 21.08.2009 - 10:57)
Да, конструктор всегда __construct.

не обязательно. если кто хочет, может делать на php4-C-шный манер - конструктор может быть назван одноименно с классом.

Спустя 17 часов, 26 минут, 21 секунда (22.08.2009 - 08:21) DenPHP написал(а):
glock18, это радует.

Michael, с иф тупанул, спасибо.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.