Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
ООП в ПХП
Новая тема
Ответить
цитата
28/02/14 в 21:10
Stek
Ну собственно да, в хабре это один из редких топиков о правильном.
цитата
28/02/14 в 21:52
freeek
grozny писал:
namespace это все-таки немного другое.
группировка по какому-то признаку это очень даже ооп.
я уже не первый год периодически подхалтуриваю на мастере и точно могу сказать что наследованиеи пр. - нахер не нужно в 90% задачах мастера
просто таким образом когда то пытались эмулировать то самое пространство имен. а в принципе объедение имеет иногда смысл, например как в Javascript объект Math, который не является конструктором и все его методы статичны и понятно что у них один контекст)
то что ооп нужно в том месте где оно нужно, никто не спорит. засовывать везде где надо и не надо смысла не имеет, а даже может усложнить и запутать. если пишется некий скрипт, где так или иначе мало кода, он нужен сейчас и у него какая то ограниченная прикладная задача, то скорее всего ооп там не надо.
цитата
28/02/14 в 23:21
Yacc
Студенты, бля.
Обсуждать ООП в ПХП надо на ПХП, а не на ломаном русском.
Писать что-то существенное некогда, поэтому ограничимся приведенным выше примером с парсерами тубов. Напишем для начала как обычно - декларативно:
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 раз
цитата
28/02/14 в 23:29
Stek
Yacc писал:
function http_get () {
return;
}
Вся суть OOP в PHP
цитата
28/02/14 в 23:45
idk2045
Yacc:
молодец не впадлу же было так расписывать
тут еще момент, что такой код легко похерить чужими кривыми руками.
так что смена кодера плохо сказывается на таких проектах. собсно отчасти потому и пишут на фреймворках, чтоб потом сразу искать людей со знанием системы ХХХ, а не просто пхпшника.
цитата
01/03/14 в 09:57
PornRank
Мужики... Реальное понимание того, зачем нужно ООП, приходит только после написания over9000 скриптов. Если вы периодически пописываете различные скриптики по мелочи, то не стоит этим заморачиваться. Суть ООП - снизить время, затрачиваемое на коммуникации при командной разработке.
цитата
01/03/14 в 09:59
freeek
Yacc писал:
Студенты, бля.
Обсуждать ООП в ПХП надо на ПХП, а не на ломаном русском.
...
Вчера было взялся пример накатать, как раз таки на примере парсеров, но было так лень, что забил на это дело
цитата
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 написан ?
Встречал дохуище проектов, написанных по правилам на фрейморках, с ORM, YAML конфигурациями и т.п. И все равно результат тот же, программист ушел - новый во всем старом говне разбирается пару месяцев, а потом лепит сверху хаки, так как фреймворк уже устарел, при обновлении куча несовместимостей, а авторы фрейморка занимаются уже только новой версией.
цитата
02/03/14 в 16:13
idk2045
AWD писал:
цель - то, что хотим получить.
суть - паталагоанатомия того, с помощью чего мы достигаем цели.
а время коммуникации/разбор кода - это не более, чем средства!
это цель и суть разработки коммерческих проектов.
а цель и суть ооп - это совсем другое) те кто придумывал ооп вообще ложили на проблемы неких заказчиков, там почти сугубо наука. ооп основан отчасти на теории фреймов, которая заодно является прародителем многих направлений в нынешнем ИИ, как-то семантические сети и пр.
вот так бля
цитата
02/03/14 в 16:16
idk2045
Stek писал:
А фрейморк разве не на php написан ?
Встречал дохуище проектов, написанных по правилам на фрейморках, с ORM, YAML конфигурациями и т.п. И все равно результат тот же, программист ушел - новый во всем старом говне разбирается пару месяцев, а потом лепит сверху хаки, так как фреймворк уже устарел, при обновлении куча несовместимостей, а авторы фрейморка занимаются уже только новой версией.
более того я бы сказал что 99% всех мелко-средних проектов этим закончат
тока большой штат сотрудников с преемственностью и дисциплина разработки могут помочь.
поэтому я всегда против наворотов в простых проектах. даже абстрактный класс это чаще всего понт
вася потом уберет слово 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 писал:
... даже абстрактный класс это чаще всего понт
вася потом уберет слово abstract и добавит пару обычных тупых методов, да еще глобалы заюзает в них.
это то же интерфейс и дисциплина
цитата
02/03/14 в 22:07
Stek
grozny писал:
даже абстрактный класс это чаще всего понт smail101.gif вася потом уберет слово abstract и добавит пару обычных тупых методов, да еще глобалы заюзает в них.
Я делаю проще, логику в __construnct() а остальные методы пустые, оставив только рабочим метод выдачи результата.
Абстрактный класс как раз нужен для описания логики, а в 99% ее не угадывают
цитата
02/03/14 в 22:49
Yacc
Жесть бля.
Я это даже прокомментировать затрудняюсь.
цитата
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 обязательно надо
а пхп сила именно потому что можно ничего не объявлять
только если в конфиге пхп у тебя на хостинге будет error_reporting E_ALL стоять, то он будет ругаться на такое. но работать все равно будет)
цитата
07/03/14 в 16:49
Yacc
Lexikon писал:
А из класса вернуть в переменную файла script.php вот такое:
Это 5к строк?
Стр.
« первая
<
1
,
2
,
3
,
4
>
последняя »
Новая тема
Ответить
Эта страница в полной версии