Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: ООП в ПХП
цитата
28/02/14 в 21:10
 Stek
Ну собственно да, в хабре это один из редких топиков о правильном.
цитата
28/02/14 в 21:52
 freeek
grozny писал:
namespace это все-таки немного другое.
группировка по какому-то признаку это очень даже ооп.
я уже не первый год периодически подхалтуриваю на мастере и точно могу сказать что наследованиеи пр. - нахер не нужно в 90% задачах мастера icon_wink.gif



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

то что ооп нужно в том месте где оно нужно, никто не спорит. засовывать везде где надо и не надо смысла не имеет, а даже может усложнить и запутать. если пишется некий скрипт, где так или иначе мало кода, он нужен сейчас и у него какая то ограниченная прикладная задача, то скорее всего ооп там не надо.
цитата
28/02/14 в 23:21
 Yacc
Студенты, бля. 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 раз
цитата
28/02/14 в 23:29
 Stek
Yacc писал:
function http_get () {
return;
}


Вся суть OOP в PHP icon_lol.gif
цитата
28/02/14 в 23:45
 idk2045
Yacc: молодец не впадлу же было так расписывать smail54.gif
тут еще момент, что такой код легко похерить чужими кривыми руками.
так что смена кодера плохо сказывается на таких проектах. собсно отчасти потому и пишут на фреймворках, чтоб потом сразу искать людей со знанием системы ХХХ, а не просто пхпшника.
цитата
01/03/14 в 09:57
 PornRank
Мужики... Реальное понимание того, зачем нужно ООП, приходит только после написания over9000 скриптов. Если вы периодически пописываете различные скриптики по мелочи, то не стоит этим заморачиваться. Суть ООП - снизить время, затрачиваемое на коммуникации при командной разработке.
цитата
01/03/14 в 09:59
 freeek
Yacc писал:
Студенты, бля. icon_smile.gif Обсуждать ООП в ПХП надо на ПХП, а не на ломаном русском.

...


Вчера было взялся пример накатать, как раз таки на примере парсеров, но было так лень, что забил на это дело smail101.gif
цитата
01/03/14 в 15:18
 Yacc
PornRank писал:
Мужики... Суть ООП - снизить время, затрачиваемое на коммуникации при командной разработке.

Не несите хуйни, молодой человек. Мужики в поле сено косят, но даже они понимают, что "снизить время, затрачиваемое на коммуникации при командной разработке" это в лучшем случае цель, но никак не суть.
цитата
02/03/14 в 11:16
 AWD
fo

Последний раз редактировалось: AWD (03/03/14 в 00:00), всего редактировалось 1 раз
цитата
02/03/14 в 11:35
 Yacc
Оффтопик: Ну, вот и что прикажете с ним делать? Нахуй послать? Дохуя чести. Игнор, только игнор, тем более что этот товарищ уже давно зарекомендовал себя как пьянь, умеющая только пиздеть, да и то коряво.
цитата
02/03/14 в 11:48
 AWD
off

Последний раз редактировалось: AWD (03/03/14 в 00:00), всего редактировалось 1 раз
цитата
02/03/14 в 15:09
 Stek
grozny писал:
собсно отчасти потому и пишут на фреймворках, чтоб потом сразу искать людей со знанием системы ХХХ, а не просто пхпшника.

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

Встречал дохуище проектов, написанных по правилам на фрейморках, с ORM, YAML конфигурациями и т.п. И все равно результат тот же, программист ушел - новый во всем старом говне разбирается пару месяцев, а потом лепит сверху хаки, так как фреймворк уже устарел, при обновлении куча несовместимостей, а авторы фрейморка занимаются уже только новой версией.
цитата
02/03/14 в 16:13
 idk2045
AWD писал:
цель - то, что хотим получить.
суть - паталагоанатомия того, с помощью чего мы достигаем цели.
а время коммуникации/разбор кода - это не более, чем средства!

это цель и суть разработки коммерческих проектов.
а цель и суть ооп - это совсем другое) те кто придумывал ооп вообще ложили на проблемы неких заказчиков, там почти сугубо наука. ооп основан отчасти на теории фреймов, которая заодно является прародителем многих направлений в нынешнем ИИ, как-то семантические сети и пр.
вот так бля smail101.gif
цитата
02/03/14 в 16:16
 idk2045
Stek писал:
А фрейморк разве не на php написан ? smail101.gif

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

более того я бы сказал что 99% всех мелко-средних проектов этим закончат icon_smile.gif
тока большой штат сотрудников с преемственностью и дисциплина разработки могут помочь.
поэтому я всегда против наворотов в простых проектах. даже абстрактный класс это чаще всего понт smail101.gif вася потом уберет слово abstract и добавит пару обычных тупых методов, да еще глобалы заюзает в них.
цитата
02/03/14 в 16:49
 Yacc
grozny писал:
а цель и суть ооп - это совсем другое)

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

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

Последний раз редактировалось: AWD (02/03/14 в 23:59), всего редактировалось 1 раз
цитата
02/03/14 в 21:09
 freeek
grozny писал:
... даже абстрактный класс это чаще всего понт smail101.gif вася потом уберет слово abstract и добавит пару обычных тупых методов, да еще глобалы заюзает в них.


это то же интерфейс и дисциплина
цитата
02/03/14 в 22:07
 Stek
grozny писал:
даже абстрактный класс это чаще всего понт smail101.gif вася потом уберет слово abstract и добавит пару обычных тупых методов, да еще глобалы заюзает в них.


Я делаю проще, логику в __construnct() а остальные методы пустые, оставив только рабочим метод выдачи результата.
Абстрактный класс как раз нужен для описания логики, а в 99% ее не угадывают smail101.gif
цитата
02/03/14 в 22:49
 Yacc
Жесть бля. smail101.gif

Я это даже прокомментировать затрудняюсь. icon_smile.gif
цитата
07/03/14 в 15:04
 Lexikon
вот дошел до той части когда у меня собран многомерный массив с данными.
теперь с этим делом нужно начать работать, хочу написать под это дело класс и одновременно разобраться с ООП.
Писать весь код в основном скрипте это просто ебануться можно, ибо то что нужно сделать в классе выйдет примерно на 5к строк. Раньше у меня было все по кускам. Все руками запускалось с отдельных файлов, но это тоже извращение!

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

За ранее благодарен.
цитата
07/03/14 в 15:43
 Stek
Передать можно разными способами.
Озвучь что за данные в массивы и примерную цель твоего класса.
цитата
07/03/14 в 15:55
 Lexikon
есть массив он в файле script.php
файл для класса class.php
к примеру есть массив

$arrDataModel = array("Андрей", "18 лет", "50 кг", "180 см", "голубые", "светлые");

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

Цитата:
"Меня зовут Андрей, мне 18 лет. Мой рост 180 см, при этом вес 50 кг. Глаза голубые, волосы светлые."
цитата
07/03/14 в 16:27
 Lexikon
вот что получилось

файл script.php

<?php
header("Content-Type: text/html; charset=UTF-8");
require_once("./class.php");
// 0 возраст / 1 вес / 2 рост / 3 цвет глаз / 4 цвет волос / 5 длина волос
$arrDataModel = array("18 лет", "50 кг", "180 см", "голубые", "светлые", "длинные");
$dataModel = new test($arrDataModel);
$resultat = $dataModel->text();
echo $resultat;
?>


файл class.php

<?php

/**
*
*/
class test
{

   public $age;
   public $weight;
   public $height;
   public $eyeColor;
   public $hairColor;
   public $lengthHair;
   
   function __construct($arrDataModel)
   {
      $this -> age       = $arrDataModel[0];
      $this -> weight    = $arrDataModel[1];
      $this -> height    = $arrDataModel[2];
      $this -> eyeColor    = $arrDataModel[3];
      $this -> hairColor    = $arrDataModel[4];
      $this -> lengthHair = $arrDataModel[5];
   }

   function text() {

      $resultat = "Меня зовут Лена, мне ".$this -> age.". Мой рост ".$this -> height." при этом вес ".$this -> weight.". У меня ".$this -> eyeColor." глаза и ".$this -> hairColor.", ".$this -> lengthHair." волосы.";

      return $resultat;

   }

}

?>


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

$this обязательно надо
а пхп сила именно потому что можно ничего не объявлять icon_smile.gif
только если в конфиге пхп у тебя на хостинге будет error_reporting E_ALL стоять, то он будет ругаться на такое. но работать все равно будет)
цитата
07/03/14 в 16:49
 Yacc
Lexikon писал:
А из класса вернуть в переменную файла script.php вот такое:

Это 5к строк?
Стр. « первая   <  1, 2, 3, 4  >  последняя »


Эта страница в полной версии