Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Praktyczne programowanie obiektowe w PHP

Praktyczne programowanie obiektowe w PHP

Czym jest programowanie obiektowe? Czy gdy mam obiekty mogę już powiedzieć że programuje obiektowo?
Powiemy sobie o abstrakcji, hermetyzacji, polimorfizmie oraz komunikacji bytów w naszym systemie na przykładach kodu w PHP. Powiemy również sobie o wzorcach i anty wzorcach związanych z programowaniem obiektowym. Zahaczymy o podstawy nomenklatury związanej z DDD czyli encje, repozytoria, value objecty – wszystko na realnych przykładach i implementacjach w PHPie

Leszek Prabucki

May 30, 2015
Tweet

More Decks by Leszek Prabucki

Other Decks in Programming

Transcript

  1. @cocoders Alan Kay – twórca Smalltaka 1998 rok Smalltalk is

    not only NOT its syntax or the class library, it is not even about classes. The big idea is "messaging" - that is what the kernel of Smalltalk/Squeak is all about
  2. namespace Cocoders\MedicalClinic; use Cocoders\MedicalClinic\Clinic; use Cocoders\MedicalClinic\TaxIdNumber; interface ClinicRegistry { public

    function find(TaxIdNumber $taxIdNumber); public function add(Clinic $clinic); } @cocoders Abstrakcja – przykłady
  3. use Cocoders\MedicalClinic\ClinicRegistry; final class HireCandidate { private $consultantRegistry; public function

    __construct(ClinicRegistry $clinicRegistry) { $this->clinicRegistry = $clinicRegistry; } //.. } @cocoders Abstrakcja - przykłady
  4. final class HireCandidate { //.. public function execute(HireCandidateCommand $command) {

    $taxIdNumber = $command->getClinicTaxIdNumber(); $clinic = $this->clinicRegistry->find($taxIdNumber); if (!$clinic) return; // logic $this->clinicRegistry->add($clinic); } } @cocoders Abstrakcja - przykłady
  5. use Cocoders\MedicalClinic\ClinicRegistry as ClinicRegistryInterface; final class SqlClinicRegistry implements ClinicRegistryInterface {

    //.. public function find(TaxIdNumber $taxIdNumber) { $clinicArray = $this->connection->fetchColumn("SELECT * FROM clinics WHERE taxIdNumber = :taxIdNumber", ['taxIdNumber' => (string) $taxIdNumber]); if ($clinicData) { return new Clinic(new TaxIdNumber($clinicArray['taxIdNumber']), $clinicArray['name']); } } } @cocoders Abstrakcja - przykłady
  6. final class DoctrineClinicRegistry implements ClinicRegistryInterface { //.. public function find(TaxIdNumber

    $taxIdNumber) { return $this ->manager->getRepository(Clinic::class) ->findOneBy(['taxIdNumber' => (string) $taxIdNumber]); } } @cocoders Abstrakcja - przykłady
  7. @cocoders $clinic->setTaxIdNumber('9562307984'); $clinic->setName('Cocoders'); $clinic->addEmployee((new Employee())- >setFirstName('Leszek'))); $clinic->getEmployees()->add((new Employee())->setFirstName('Szymon')); vs $clinic

    = new Clinic('Cocoders', ' 9562307984'); $clinic->hire(new Candidate('Leszek')); $clinic->hire(new Candidate('Szymon')); Gettery i settery a hermetyzacja
  8. final class TaxIdNumber { private $taxIdNumber; public function __construct($taxIdNumber) {

    self::assertIsValid($taxIdNumber) $this->taxIdNumber = $taxIdNumber; } public function __toString() { return $this->taxIdNumber; } private static function assertIsValid($str) { //.. } } @cocoders Value Object
  9. @cocoders $request = Request::createFromGlobals(); $request->setFormat('json', 'application/json'); // somewhere in there

    external bundle or component function ($request) { $request->setFormat('json', 'myJsonP/srututututu'); } echo $request->getFormat('json');