Реклама на сайте Advertise with us

ООП в ПХП

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 28/02/14 в 21:10       Ответить с цитатойцитата 

Ну собственно да, в хабре это один из редких топиков о правильном.

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

0
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 28/02/14 в 21:52       Ответить с цитатойцитата 

grozny писал:
namespace это все-таки немного другое.
группировка по какому-то признаку это очень даже ооп.
я уже не первый год периодически подхалтуриваю на мастере и точно могу сказать что наследованиеи пр. - нахер не нужно в 90% задачах мастера icon_wink.gif



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

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

0
 



С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538


Передовик Master-X (01.11.2009) Передовик Master-X (16.11.2009) Передовик Master-X (01.02.2011) Передовик Master-X (01.12.2011) Передовик Master-X (16.12.2011) Ветеран трепа Master-X (01.01.2014)
Ссылка на сообщениеДобавлено: 28/02/14 в 23:21       Ответить с цитатойцитата 

Студенты, бля. icon_smile.gif Обсуждать ООП в ПХП надо на ПХП, а не на ломаном русском.

Писать что-то существенное некогда, поэтому ограничимся приведенным выше примером с парсерами тубов. Напишем для начала как обычно - декларативно:

index.php
Код:
function http_get () {
    return;
}

function tube8_parse () {
    $page = http_get();
    return __FUNCTION__;
}
function tube8_get_video_url($page) {
    return $page;
}

function youporn_parse () {
    $page = http_get();
    return __FUNCTION__;
}
function youporn_get_video_url($page) {
    return $page;
}

if (isset($_GET['tube'])) {
    $parser = $_GET['tube'] . '_parse';
    echo call_user_func($parser);
}

Мы еще ничего не написали, а уже налицо нарушение одного из основополагающих принципов не только ООП, а вообще качественного кода - не повторятся. Попробуем переписать. Для этого заметим что у каждого туба есть по-разному реализованные методы parse и get_video_url, а так же что оба метода parse используют один и тот же метод http_get. В терминах ООП это укладывается в шаблон Интерфейс:

classes/Base/IParser.php
Код:
<?php defined('APP') OR die;

interface Base_IParser {

    function parse ();
}

classes/Base/Parser.php
Код:
<?php defined('APP') OR die;

abstract class Base_Parser implements Base_IParser {

    abstract function get_video_url ();

    function http_get () {
        return __CLASS__ . '->' . __FUNCTION__;
    }
}

Далее заметим что для работы нашего парсера значение имеет только наличие метода parse, детали реализации не важны, а так же что необходимо выбирать подходящий метод парсинга в зависимости от параметра в $_GET. Это укладывается в шаблон Стратегия:

classes/App.php
Код:
<?php defined('APP') OR die;

class App {
   
    private $_parser;
   
    public function parse () {
        return $this->_parser->parse();
    }
   
    public function __construct(Base_IParser $parser) {
        $this->_parser = $parser;
    }
}

Остается реализовать сами парсеры:

classes/Youporn/Parser.php
Код:
<?php defined('APP') OR die;

class Youporn_Parser extends Base_Parser {
   
    function parse () {
        return $this->get_video_url();
    }
   
    function get_video_url () {
        return $this->http_get();
    }
}

classes/Tube8/Parser.php
Код:
<?php defined('APP') OR die;

class Tube8_Parser extends Base_Parser {
   
    function parse () {
        return $this->get_video_url();
    }
   
    function get_video_url () {
        return $this->http_get();
    }
   
    function http_get () {
        return __CLASS__ . '->' . __FUNCTION__;
    }
}

и

index.php
Код:
<?php

define('DS', DIRECTORY_SEPARATOR);
define('PHP', '.php');
define('APP', 'App');
define('ROOT', realpath(dirname(__FILE__)) . DS);
define('CLASSES', ROOT . 'classes' . DS);

require (CLASSES . APP . PHP);

spl_autoload_register(function ($class) {
    if (file_exists(($file = CLASSES . str_replace('_', DS, $class) . PHP))) {
        require $file;
        return true;
    }
    return false;
});

$parser = ucfirst(strtolower(preg_replace('#[^a-z0-9]#', '', $_GET['tube'])). '_Parser');

$app = new App(new $parser);
echo $app->parse();


Здесь собственно приложение сосредоточно в последних трех строчка, остальное мишура, необходимая для работы всего остального. Наличие мишуры и тот факт, что мишура по размеру сопоставима с декларативным вариантом, не должны вас смущать. Когда классов станет не 2, а 20 или 200, мишуры останется столько же.

Что нам это дало?

Благодаря инкапсуляции и грамотно выбранным шаблонами проектирования мы получили приложение с модульной архитектурой и со слабой зависимостью между классами: экземпляры App ничего не знают про Tube8_Parser и Youporn_Parser, все что им нужно это экземпляр класса реализовавшего интерфейс Base_IParser. Можно спокойно менять реализации парсеров и добавлять новые, на основное приложение это никак не повлияет.

Благодаря наследованию и полиморфизму мы избавились от потенциальной кучи повторяющегося кода, а благодаря механизму автозагрузки и от необходимости бесконечных require.

Это ООП. icon_smile.gif

Скачать все файлы примера можно по ссылке.

Последний раз редактировалось: Yacc (28/02/14 в 23:32), всего редактировалось 1 раз

1
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 28/02/14 в 23:29       Ответить с цитатойцитата 

Yacc писал:
function http_get () {
return;
}


Вся суть OOP в PHP icon_lol.gif

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

0
 



С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506

Ссылка на сообщениеДобавлено: 28/02/14 в 23:45       Ответить с цитатойцитата 

Yacc: молодец не впадлу же было так расписывать smail54.gif
тут еще момент, что такой код легко похерить чужими кривыми руками.
так что смена кодера плохо сказывается на таких проектах. собсно отчасти потому и пишут на фреймворках, чтоб потом сразу искать людей со знанием системы ХХХ, а не просто пхпшника.

0
 



С нами с 28.11.09
Сообщения: 43
Рейтинг: 39

Ссылка на сообщениеДобавлено: 01/03/14 в 09:57       Ответить с цитатойцитата 

Мужики... Реальное понимание того, зачем нужно ООП, приходит только после написания over9000 скриптов. Если вы периодически пописываете различные скриптики по мелочи, то не стоит этим заморачиваться. Суть ООП - снизить время, затрачиваемое на коммуникации при командной разработке.

0
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 01/03/14 в 09:59       Ответить с цитатойцитата 

Yacc писал:
Студенты, бля. icon_smile.gif Обсуждать ООП в ПХП надо на ПХП, а не на ломаном русском.

...


Вчера было взялся пример накатать, как раз таки на примере парсеров, но было так лень, что забил на это дело smail101.gif

0
 



С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538


Передовик Master-X (01.11.2009) Передовик Master-X (16.11.2009) Передовик Master-X (01.02.2011) Передовик Master-X (01.12.2011) Передовик Master-X (16.12.2011) Ветеран трепа Master-X (01.01.2014)
Ссылка на сообщениеДобавлено: 01/03/14 в 15:18       Ответить с цитатойцитата 

PornRank писал:
Мужики... Суть ООП - снизить время, затрачиваемое на коммуникации при командной разработке.

Не несите хуйни, молодой человек. Мужики в поле сено косят, но даже они понимают, что "снизить время, затрачиваемое на коммуникации при командной разработке" это в лучшем случае цель, но никак не суть.

0
 



С нами с 03.02.11
Сообщения: 842
Рейтинг: 301

Ссылка на сообщениеДобавлено: 02/03/14 в 11:16       Ответить с цитатойцитата 

fo

Последний раз редактировалось: AWD (03/03/14 в 00:00), всего редактировалось 1 раз

-1
 



С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538


Передовик Master-X (01.11.2009) Передовик Master-X (16.11.2009) Передовик Master-X (01.02.2011) Передовик Master-X (01.12.2011) Передовик Master-X (16.12.2011) Ветеран трепа Master-X (01.01.2014)
Ссылка на сообщениеДобавлено: 02/03/14 в 11:35       Ответить с цитатойцитата 

Оффтопик: Ну, вот и что прикажете с ним делать? Нахуй послать? Дохуя чести. Игнор, только игнор, тем более что этот товарищ уже давно зарекомендовал себя как пьянь, умеющая только пиздеть, да и то коряво.

0
 



С нами с 03.02.11
Сообщения: 842
Рейтинг: 301

Ссылка на сообщениеДобавлено: 02/03/14 в 11:48       Ответить с цитатойцитата 

off

Последний раз редактировалось: AWD (03/03/14 в 00:00), всего редактировалось 1 раз

-1
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 02/03/14 в 15:09       Ответить с цитатойцитата 

grozny писал:
собсно отчасти потому и пишут на фреймворках, чтоб потом сразу искать людей со знанием системы ХХХ, а не просто пхпшника.

А фрейморк разве не на php написан ? smail101.gif

Встречал дохуище проектов, написанных по правилам на фрейморках, с ORM, YAML конфигурациями и т.п. И все равно результат тот же, программист ушел - новый во всем старом говне разбирается пару месяцев, а потом лепит сверху хаки, так как фреймворк уже устарел, при обновлении куча несовместимостей, а авторы фрейморка занимаются уже только новой версией.

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

0
 



С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506

Ссылка на сообщениеДобавлено: 02/03/14 в 16:13       Ответить с цитатойцитата 

AWD писал:
цель - то, что хотим получить.
суть - паталагоанатомия того, с помощью чего мы достигаем цели.
а время коммуникации/разбор кода - это не более, чем средства!

это цель и суть разработки коммерческих проектов.
а цель и суть ооп - это совсем другое) те кто придумывал ооп вообще ложили на проблемы неких заказчиков, там почти сугубо наука. ооп основан отчасти на теории фреймов, которая заодно является прародителем многих направлений в нынешнем ИИ, как-то семантические сети и пр.
вот так бля smail101.gif

0
 



С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506

Ссылка на сообщениеДобавлено: 02/03/14 в 16:16       Ответить с цитатойцитата 

Stek писал:
А фрейморк разве не на php написан ? smail101.gif

Встречал дохуище проектов, написанных по правилам на фрейморках, с ORM, YAML конфигурациями и т.п. И все равно результат тот же, программист ушел - новый во всем старом говне разбирается пару месяцев, а потом лепит сверху хаки, так как фреймворк уже устарел, при обновлении куча несовместимостей, а авторы фрейморка занимаются уже только новой версией.

более того я бы сказал что 99% всех мелко-средних проектов этим закончат icon_smile.gif
тока большой штат сотрудников с преемственностью и дисциплина разработки могут помочь.
поэтому я всегда против наворотов в простых проектах. даже абстрактный класс это чаще всего понт smail101.gif вася потом уберет слово abstract и добавит пару обычных тупых методов, да еще глобалы заюзает в них.

0
 



С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538


Передовик Master-X (01.11.2009) Передовик Master-X (16.11.2009) Передовик Master-X (01.02.2011) Передовик Master-X (01.12.2011) Передовик Master-X (16.12.2011) Ветеран трепа Master-X (01.01.2014)
Ссылка на сообщениеДобавлено: 02/03/14 в 16:49       Ответить с цитатойцитата 

grozny писал:
а цель и суть ооп - это совсем другое)

Я бы с этой пьянью вообще беседы не вел на твоем месте. Ибо нехуй сюда пьяным приходить.

Что касается сути и целей, то все просто здесь. Суть ООП заложена в трех словах: инкапсуляция, наследование и полиморфизм. Целью же является унификация процессов разработки ПО. Все. Нет тут ничего ни про классы, ни про сроки, ни про каких-то разработчиков.

0
 



С нами с 03.02.11
Сообщения: 842
Рейтинг: 301

Ссылка на сообщениеДобавлено: 02/03/14 в 18:19       Ответить с цитатойцитата 

bye

Последний раз редактировалось: AWD (02/03/14 в 23:59), всего редактировалось 1 раз

-1
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 02/03/14 в 21:09       Ответить с цитатойцитата 

grozny писал:
... даже абстрактный класс это чаще всего понт smail101.gif вася потом уберет слово abstract и добавит пару обычных тупых методов, да еще глобалы заюзает в них.


это то же интерфейс и дисциплина

0
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 02/03/14 в 22:07       Ответить с цитатойцитата 

grozny писал:
даже абстрактный класс это чаще всего понт smail101.gif вася потом уберет слово abstract и добавит пару обычных тупых методов, да еще глобалы заюзает в них.


Я делаю проще, логику в __construnct() а остальные методы пустые, оставив только рабочим метод выдачи результата.
Абстрактный класс как раз нужен для описания логики, а в 99% ее не угадывают smail101.gif

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

0
 



С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538


Передовик Master-X (01.11.2009) Передовик Master-X (16.11.2009) Передовик Master-X (01.02.2011) Передовик Master-X (01.12.2011) Передовик Master-X (16.12.2011) Ветеран трепа Master-X (01.01.2014)
Ссылка на сообщениеДобавлено: 02/03/14 в 22:49       Ответить с цитатойцитата 

Жесть бля. smail101.gif

Я это даже прокомментировать затрудняюсь. icon_smile.gif

0
 

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 07/03/14 в 15:04       Ответить с цитатойцитата 

вот дошел до той части когда у меня собран многомерный массив с данными.
теперь с этим делом нужно начать работать, хочу написать под это дело класс и одновременно разобраться с ООП.
Писать весь код в основном скрипте это просто ебануться можно, ибо то что нужно сделать в классе выйдет примерно на 5к строк. Раньше у меня было все по кускам. Все руками запускалось с отдельных файлов, но это тоже извращение!

Поэетому вопрос.
Как правильно передать в класс массив, чтоб потом в классе работать со значениями массива?

За ранее благодарен.

0
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 07/03/14 в 15:43       Ответить с цитатойцитата 

Передать можно разными способами.
Озвучь что за данные в массивы и примерную цель твоего класса.

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

8
 

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 07/03/14 в 15:55       Ответить с цитатойцитата 

есть массив он в файле script.php
файл для класса class.php
к примеру есть массив
Код: [развернуть]

Я дожен отдать этот массив в класс. А из класса вернуть в переменную файла script.php вот такое:

Цитата:
"Меня зовут Андрей, мне 18 лет. Мой рост 180 см, при этом вес 50 кг. Глаза голубые, волосы светлые."

0
 

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 07/03/14 в 16:27       Ответить с цитатойцитата 

вот что получилось

файл script.php
Код: [развернуть]


файл class.php
Код: [развернуть]


но возникли некоторые вопросы, нужно ли в самом начале класса объявлять переменные? (если я их не объявляю скрипт тоже работает)
И я почему то думал что внутри класса, к переменным можно обращаться напрямую $height, а не $this -> height

0
 



С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506

Ссылка на сообщениеДобавлено: 07/03/14 в 16:37       Ответить с цитатойцитата 

Lexikon писал:
но возникли некоторые вопросы, нужно ли в самом начале класса объявлять переменные? (если я их не объявляю скрипт тоже работает)
И я почему то думал что внутри класса, к переменным можно обращаться напрямую $height, а не $this -> height

$this обязательно надо
а пхп сила именно потому что можно ничего не объявлять icon_smile.gif
только если в конфиге пхп у тебя на хостинге будет error_reporting E_ALL стоять, то он будет ругаться на такое. но работать все равно будет)

8
 



С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538


Передовик Master-X (01.11.2009) Передовик Master-X (16.11.2009) Передовик Master-X (01.02.2011) Передовик Master-X (01.12.2011) Передовик Master-X (16.12.2011) Ветеран трепа Master-X (01.01.2014)
Ссылка на сообщениеДобавлено: 07/03/14 в 16:49       Ответить с цитатойцитата 

Lexikon писал:
А из класса вернуть в переменную файла script.php вот такое:

Это 5к строк?

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »