Дорогие друзья, могли бы дайть ссылочки на примеры проектов в ООП стиле с русской поддержкой ? Англ ,к сожаленью, на 0 уровне. Хочу понять, как мыслят программисты пишущие на ООП.
Думаю трудно такое найти, обычно комментируют просто для чего метод, чтобы потом на основании комментариев сгенерировать документацию, ещё не очевидные места комментируют, там где код по мнению автора получился запутанным или не понятным. Смотри код framework'ов, таких как yii2, symafony3 и т. д. Почитай что такое PSR. Есть книги с описанием ООП, и книги по ООП и PHP.
Чтобы понять ООП, нужно понять, что такое полиморфизм. Это самое сложное в ООП. Неумение писать в ООП-стиле в 99% означает непонимание принципа полиморфизма.
А какой имеено полиморфизм нужно понять? Перегрузку методов? Параметрический полиморфизм / дженерики? Подтипов? В общем глупость сказали. Наличие полиморфизма вообще не означает наличие ООП.
Когда читаешь код и не понимаешь для чего автор его писал, появляется мотивация перевести комментарии. Перевод комментов кода, для меня было отправной точкой в изучении англ.
Hello World на ООП PHP: /******************************************************************** Model-View-Controller implementation according to POSA (Pattern-Oriented Software Architecture http://www.hillside.net/patterns/books/Siemens/book.html) ********************************************************************/ class HelloWorldController { private $model; function __construct($model) { $this->model = $model; } function handleEvent($args) { $this->model->setStrategy($args[2]); $this->model->addText($args[1]); } } class HelloWorldModel { private $text; private $observers = array(); private $strategy; function attach($observer) { $this->observers[] = $observer; } function getData() { $facade = new HelloWorldFacade($this->strategy); return $facade->getHelloWorld().$this->text."\n"; } function addText($text='') { $this->text = $text; $this->notify(); } function setStrategy($strategy) { $this->strategy = $strategy; } function notify() { foreach ($this->observers as $observer) { $observer->update(); } } } class HelloWorldView { private $model; function initialize($model) { $this->model = $model; $model->attach($this); return $this->makeController(); } function makeController() { return new HelloWorldController($this->model); } function update() { $this->display(); } function display() { echo $this->model->getData(); } } /********************************************************************* "Business logic" ********************************************************************/ class HelloWorld { function execute() { return "Hello world"; } } class HelloWorldDecorator { private $helloworld; function __construct($helloworld) { $this->helloworld = $helloworld; } function execute() { return $this->helloworld->execute(); } } abstract class HelloWorldEmphasisStrategy { abstract function emphasize($string); } class HelloWorldBangEmphasisStrategy extends HelloWorldEmphasisStrategy { function emphasize($string) { return $string."!"; } } class HelloWorldRepetitionEmphasisStrategy extends HelloWorldEmphasisStrategy { function emphasize($string) { return $string." and ".$string." again"; } } class HelloWorldEmphasizer extends HelloWorldDecorator { private $strategy; function HelloWorldEmphasizer($helloworld,$strategy) { $this->strategy = $strategy; parent::__construct($helloworld); } function execute() { $string = parent::execute(); return $this->strategy->emphasize($string); } } class HelloWorldStrategyFactory { static function make($type) { if ($type == 'repetition') return self::makeRepetitionStrategy(); return self::makeBangStrategy(); } static function makeBangStrategy() { return new HelloWorldBangEmphasisStrategy; } static function makeRepetitionStrategy() { return new HelloWorldRepetitionEmphasisStrategy; } } class HelloWorldFormatter extends HelloWorldDecorator { function execute() { $string = parent::execute(); return $string."\n"; } } class HelloWorldFacade { private $strategy; function __construct($strategyType) { $this->strategy = HelloWorldStrategyFactory::make($strategyType); } function getHelloWorld() { $formatter = new HelloWorldFormatter( new HelloWorldEmphasizer( new HelloWorld,$this->strategy)); return $formatter->execute(); } } $model = new HelloWorldModel; $view = new HelloWorldView; $controller = $view->initialize($model); $controller->handleEvent($_SERVER['argv']);
Я про использование в реальных проектах, а не про теоретические познания и выученные определения. В идеале, чтобы код назвать ОО каждый его метод должен быть полиморфным. В реальности так мало кто делает.
Я тоже про использование в реальных проектах. Все эти проявления полиморфизма - вполне себе используются в реальных проектах. И перегрузка, и дженерики. Каждый метод полиморфный? Т.е. вы все же про перегрузку методов? Ну так PHP не поддерживает перегрузку.
В пхп можно задавать дефолтные значения и нет строгой типизации. Можно сказать, что методы пхп в принципе изначально рождаются потенциально перегруженными. Ничто не мешает внутри метода выяснить число аргументов и их тип, и делать разное. Хотя конечно это не так, как обычно выглядит.
Ага, а с помощю соседней пачки костылей в ПХП можно и дженерики https://github.com/TimeToogo/PHP-Generics