www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 28/02/14 в 21:10 |
Ну собственно да, в хабре это один из редких топиков о правильном.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
0
|
|
|
С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134
|
Добавлено: 28/02/14 в 21:52 |
grozny писал: | namespace это все-таки немного другое.
группировка по какому-то признаку это очень даже ооп.
я уже не первый год периодически подхалтуриваю на мастере и точно могу сказать что наследованиеи пр. - нахер не нужно в 90% задачах мастера |
просто таким образом когда то пытались эмулировать то самое пространство имен. а в принципе объедение имеет иногда смысл, например как в Javascript объект Math, который не является конструктором и все его методы статичны и понятно что у них один контекст)
то что ооп нужно в том месте где оно нужно, никто не спорит. засовывать везде где надо и не надо смысла не имеет, а даже может усложнить и запутать. если пишется некий скрипт, где так или иначе мало кода, он нужен сейчас и у него какая то ограниченная прикладная задача, то скорее всего ооп там не надо.
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 28/02/14 в 23:21 |
Студенты, бля. Обсуждать ООП в ПХП надо на ПХП, а не на ломаном русском.
Писать что-то существенное некогда, поэтому ограничимся приведенным выше примером с парсерами тубов. Напишем для начала как обычно - декларативно:
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.
Это ООП.
Скачать все файлы примера можно по ссылке.
Последний раз редактировалось: Yacc (28/02/14 в 23:32), всего редактировалось 1 раз
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 28/02/14 в 23:29 |
Yacc писал: | function http_get () {
return;
} |
Вся суть OOP в PHP
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
0
|
|
|
С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506
|
Добавлено: 28/02/14 в 23:45 |
Yacc: молодец не впадлу же было так расписывать
тут еще момент, что такой код легко похерить чужими кривыми руками.
так что смена кодера плохо сказывается на таких проектах. собсно отчасти потому и пишут на фреймворках, чтоб потом сразу искать людей со знанием системы ХХХ, а не просто пхпшника.
|
|
|
|
С нами с 28.11.09
Сообщения: 43
Рейтинг: 39
|
Добавлено: 01/03/14 в 09:57 |
Мужики... Реальное понимание того, зачем нужно ООП, приходит только после написания over9000 скриптов. Если вы периодически пописываете различные скриптики по мелочи, то не стоит этим заморачиваться. Суть ООП - снизить время, затрачиваемое на коммуникации при командной разработке.
|
|
|
|
С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134
|
Добавлено: 01/03/14 в 09:59 |
Yacc писал: | Студенты, бля. Обсуждать ООП в ПХП надо на ПХП, а не на ломаном русском.
...
|
Вчера было взялся пример накатать, как раз таки на примере парсеров, но было так лень, что забил на это дело
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 01/03/14 в 15:18 |
PornRank писал: | Мужики... Суть ООП - снизить время, затрачиваемое на коммуникации при командной разработке. |
Не несите хуйни, молодой человек. Мужики в поле сено косят, но даже они понимают, что "снизить время, затрачиваемое на коммуникации при командной разработке" это в лучшем случае цель, но никак не суть.
|
|
|
|
С нами с 03.02.11
Сообщения: 842
Рейтинг: 301
|
Добавлено: 02/03/14 в 11:16 |
fo
Последний раз редактировалось: AWD (03/03/14 в 00:00), всего редактировалось 1 раз
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 02/03/14 в 11:35 |
Оффтопик: Ну, вот и что прикажете с ним делать? Нахуй послать? Дохуя чести. Игнор, только игнор, тем более что этот товарищ уже давно зарекомендовал себя как пьянь, умеющая только пиздеть, да и то коряво.
|
|
|
|
С нами с 03.02.11
Сообщения: 842
Рейтинг: 301
|
Добавлено: 02/03/14 в 11:48 |
off
Последний раз редактировалось: AWD (03/03/14 в 00:00), всего редактировалось 1 раз
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 02/03/14 в 15:09 |
grozny писал: | собсно отчасти потому и пишут на фреймворках, чтоб потом сразу искать людей со знанием системы ХХХ, а не просто пхпшника. |
А фрейморк разве не на php написан ?
Встречал дохуище проектов, написанных по правилам на фрейморках, с ORM, YAML конфигурациями и т.п. И все равно результат тот же, программист ушел - новый во всем старом говне разбирается пару месяцев, а потом лепит сверху хаки, так как фреймворк уже устарел, при обновлении куча несовместимостей, а авторы фрейморка занимаются уже только новой версией.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
0
|
|
|
С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506
|
Добавлено: 02/03/14 в 16:13 |
AWD писал: | цель - то, что хотим получить.
суть - паталагоанатомия того, с помощью чего мы достигаем цели.
а время коммуникации/разбор кода - это не более, чем средства! |
это цель и суть разработки коммерческих проектов.
а цель и суть ооп - это совсем другое) те кто придумывал ооп вообще ложили на проблемы неких заказчиков, там почти сугубо наука. ооп основан отчасти на теории фреймов, которая заодно является прародителем многих направлений в нынешнем ИИ, как-то семантические сети и пр.
вот так бля
|
|
|
|
С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506
|
Добавлено: 02/03/14 в 16:16 |
Stek писал: | А фрейморк разве не на php написан ?
Встречал дохуище проектов, написанных по правилам на фрейморках, с ORM, YAML конфигурациями и т.п. И все равно результат тот же, программист ушел - новый во всем старом говне разбирается пару месяцев, а потом лепит сверху хаки, так как фреймворк уже устарел, при обновлении куча несовместимостей, а авторы фрейморка занимаются уже только новой версией. |
более того я бы сказал что 99% всех мелко-средних проектов этим закончат
тока большой штат сотрудников с преемственностью и дисциплина разработки могут помочь.
поэтому я всегда против наворотов в простых проектах. даже абстрактный класс это чаще всего понт вася потом уберет слово abstract и добавит пару обычных тупых методов, да еще глобалы заюзает в них.
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 02/03/14 в 16:49 |
grozny писал: | а цель и суть ооп - это совсем другое) |
Я бы с этой пьянью вообще беседы не вел на твоем месте. Ибо нехуй сюда пьяным приходить.
Что касается сути и целей, то все просто здесь. Суть ООП заложена в трех словах: инкапсуляция, наследование и полиморфизм. Целью же является унификация процессов разработки ПО. Все. Нет тут ничего ни про классы, ни про сроки, ни про каких-то разработчиков.
|
|
|
|
С нами с 03.02.11
Сообщения: 842
Рейтинг: 301
|
Добавлено: 02/03/14 в 18:19 |
bye
Последний раз редактировалось: AWD (02/03/14 в 23:59), всего редактировалось 1 раз
|
|
|
|
С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134
|
Добавлено: 02/03/14 в 21:09 |
grozny писал: | ... даже абстрактный класс это чаще всего понт вася потом уберет слово abstract и добавит пару обычных тупых методов, да еще глобалы заюзает в них. |
это то же интерфейс и дисциплина
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 02/03/14 в 22:07 |
grozny писал: | даже абстрактный класс это чаще всего понт smail101.gif вася потом уберет слово abstract и добавит пару обычных тупых методов, да еще глобалы заюзает в них. |
Я делаю проще, логику в __construnct() а остальные методы пустые, оставив только рабочим метод выдачи результата.
Абстрактный класс как раз нужен для описания логики, а в 99% ее не угадывают
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
0
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 02/03/14 в 22:49 |
Жесть бля.
Я это даже прокомментировать затрудняюсь.
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 07/03/14 в 15:04 |
вот дошел до той части когда у меня собран многомерный массив с данными.
теперь с этим делом нужно начать работать, хочу написать под это дело класс и одновременно разобраться с ООП.
Писать весь код в основном скрипте это просто ебануться можно, ибо то что нужно сделать в классе выйдет примерно на 5к строк. Раньше у меня было все по кускам. Все руками запускалось с отдельных файлов, но это тоже извращение!
Поэетому вопрос.
Как правильно передать в класс массив, чтоб потом в классе работать со значениями массива?
За ранее благодарен.
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 07/03/14 в 15:43 |
Передать можно разными способами.
Озвучь что за данные в массивы и примерную цель твоего класса.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
8
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 07/03/14 в 15:55 |
есть массив он в файле script.php
файл для класса class.php
к примеру есть массив
Код: [развернуть] |
$arrDataModel = array("Андрей", "18 лет", "50 кг", "180 см", "голубые", "светлые");
|
Я дожен отдать этот массив в класс. А из класса вернуть в переменную файла script.php вот такое:
Цитата: | "Меня зовут Андрей, мне 18 лет. Мой рост 180 см, при этом вес 50 кг. Глаза голубые, волосы светлые." |
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 07/03/14 в 16:27 |
вот что получилось
файл 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
|
|
|
|
С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506
|
Добавлено: 07/03/14 в 16:37 |
Lexikon писал: | но возникли некоторые вопросы, нужно ли в самом начале класса объявлять переменные? (если я их не объявляю скрипт тоже работает)
И я почему то думал что внутри класса, к переменным можно обращаться напрямую $height, а не $this -> height |
$this обязательно надо
а пхп сила именно потому что можно ничего не объявлять
только если в конфиге пхп у тебя на хостинге будет error_reporting E_ALL стоять, то он будет ругаться на такое. но работать все равно будет)
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 07/03/14 в 16:49 |
Lexikon писал: | А из класса вернуть в переменную файла script.php вот такое: |
Это 5к строк?
|
|
|
|