seven steps to better php code

62
Seven Steps Seven Steps to Better OOP Code to Better OOP Code Stefan Priebsch Stefan Priebsch thePHP.cc thePHP.cc ZendCon09 ZendCon09

Upload: guestacd674c

Post on 17-May-2015

2.183 views

Category:

Technology


0 download

DESCRIPTION

You have a basic OOP knowledge in PHP? You have seen the usual examples, but don't really see how to apply them to solve your coding problems? This session will show you how you can make better use of OOP by presenting seven best practices and teach you how to apply them in real life. Topics covered include dependency injection, separation of concerns, loose coupling, and much more.

TRANSCRIPT

Page 1: Seven Steps to Better PHP Code

Seven StepsSeven Stepsto Better OOP Code to Better OOP Code

Stefan PriebschStefan Priebsch

thePHP.ccthePHP.cc

ZendCon09ZendCon09

Page 2: Seven Steps to Better PHP Code

Stefan PriebschStefan PriebschCo-Founder and Principal ConsultantCo-Founder and Principal Consultant

Page 3: Seven Steps to Better PHP Code

Premium PHP Consulting & Training. Worldwide.

ArneBlankerts

Sebastian Bergmann

StefanPriebsch

Page 4: Seven Steps to Better PHP Code

DisclaimerDisclaimer

Page 5: Seven Steps to Better PHP Code

„„Hang the rules. Hang the rules. They're more like They're more like guidelines anyway.“guidelines anyway.“

--Elizabeth Swann,--Elizabeth Swann,Pirates of the CaribbeanPirates of the Caribbean

Page 6: Seven Steps to Better PHP Code

Is OOP slow?Is OOP slow?

Page 7: Seven Steps to Better PHP Code

The usual disclaimer for benchmarks applies!The usual disclaimer for benchmarks applies!

foo() foo() 3.09 µsec3.09 µsec

Test::foo() 3.26 µsec

$test->foo() 3.12 µsec

$test = new Test();$test->foo() 4.03 µsec

Page 8: Seven Steps to Better PHP Code

25% slower!25% slower!

Page 9: Seven Steps to Better PHP Code

1 µsec1 µsec

Page 10: Seven Steps to Better PHP Code

The usual disclaimer for benchmarks applies!The usual disclaimer for benchmarks applies!

print ~ 10 µsec

file_get_contents() ~ 30 µsec

mysql_connect() ~ 100 µsec

HTTP GET Request ~ 35,000 µsec

Page 11: Seven Steps to Better PHP Code

I/O is whereI/O is wherethe action is.the action is.

Page 12: Seven Steps to Better PHP Code

OOP isOOP isfast enough.fast enough.

Page 13: Seven Steps to Better PHP Code

Do not care about Do not care about performanceperformance**

*Some restrictions may apply.*Some restrictions may apply.

#1#1

Page 14: Seven Steps to Better PHP Code

WhatWhatdo youdo youdo for ado for aliving?living?

Page 15: Seven Steps to Better PHP Code

class Something{ public function doWork() { … load data …

… perform calculations …

… render HTML output …

… store calculation result ... }}

Page 16: Seven Steps to Better PHP Code

class Something{ public function doManyThings() { $this->loadData(); $this->performCalculations(); $this->renderHtml(); $this->storeResult(); }

protected function loadData() protected function performCalulations() protected function renderHtml() protected function storeResult()}

Page 17: Seven Steps to Better PHP Code

class DataLoader{ public function loadData()}

class Calculator{ public function calculateResult()}

class HtmlRenderer{ public function render()}

class StorageManager{ public function storeResult()}

Page 18: Seven Steps to Better PHP Code

Clearly separate Clearly separate different concernsdifferent concerns#2#2

Page 19: Seven Steps to Better PHP Code

One ResponsibilityOne Responsibility

Page 20: Seven Steps to Better PHP Code

class SomeObject{ protected function loadData() { $this->data = $this->db->query(...); }

public function render() { $this->loadData(); return HtmlRenderer::createTable($this->data); }}

Page 21: Seven Steps to Better PHP Code

Let othersLet othersdo the work.do the work.

Page 22: Seven Steps to Better PHP Code

class CrystalBall{ public function predictLottoNumbers($a, $b, $c) { …

return new LottoNumbers(...); }}

Page 23: Seven Steps to Better PHP Code

Focus on the APIFocus on the API#3#3

Page 24: Seven Steps to Better PHP Code

Interface vs. Interface vs. ImplementationImplementation

Page 25: Seven Steps to Better PHP Code

Keep secretsKeep secrets

Page 26: Seven Steps to Better PHP Code

class Person{ protected function talk() { Stranger::askForACigarette(); }}

Page 27: Seven Steps to Better PHP Code

class Person{ protected function talk() { Stranger::getInstance()->askForACigarette(); }}

Page 28: Seven Steps to Better PHP Code

class Person{ protected function talkTo(Friend $friend) { $friend->askForACigarette(); }}

class Friend{ public function askForACigarette() { return new Cigarette(); }}

Page 29: Seven Steps to Better PHP Code

Do not talkDo not talkto strangers.to strangers.

Page 30: Seven Steps to Better PHP Code

Create loosely Create loosely coupled classescoupled classes#4#4

Page 31: Seven Steps to Better PHP Code

Make Make dependencies dependencies

explicit.explicit.

Page 32: Seven Steps to Better PHP Code

class SomeObject{ protected function loadData() { $this->data = $this->db->query(...); }

public function render() { $this->loadData(); return HtmlRenderer::createTable($this->data); }}

Page 33: Seven Steps to Better PHP Code

class SomeObject{ protected function loadData() { $this->data = $this->db->query(...); }

public function render(Renderer $renderer) { $this->loadData(); return $this->renderer->createTable($this->data); }}

Page 34: Seven Steps to Better PHP Code

class SomeObject{ protected function loadData(DbGateway $db) { $this->data = $db->query(...); }

public function render(Renderer $renderer) { $this->loadData(); return $renderer->createTable($this->data); }}

Page 35: Seven Steps to Better PHP Code

class SomeObject{ public function __construct(DbGateway $db, Renderer $r) { $this->db = $db; $this->renderer = $r; }

...}

Page 36: Seven Steps to Better PHP Code

Use dependency Use dependency injectioninjection#5#5

Page 37: Seven Steps to Better PHP Code

class Engine{ public function start(); public functoin stop(); public function goFaster($amount); public function goSlower($amount);}

Page 38: Seven Steps to Better PHP Code

class Car extends Engine{ ...}

Page 39: Seven Steps to Better PHP Code

class SteeringWheel{ public function turnRight($degrees); public function turnLeft($degree);}

Page 40: Seven Steps to Better PHP Code

class Car extends Engine extends SteeringWheel{ ...}

Page 41: Seven Steps to Better PHP Code

Multiple inheritance?Multiple inheritance?

Page 42: Seven Steps to Better PHP Code

EngineEngine

Page 43: Seven Steps to Better PHP Code

EngineEngine++

Steering WheelSteering Wheel

Page 44: Seven Steps to Better PHP Code

EngineEngine++

Steering WheelSteering Wheel++

SeatSeat

Page 45: Seven Steps to Better PHP Code

CombineCombineobjects.objects.

Page 46: Seven Steps to Better PHP Code

CarCar

EngineEngine

SeatSeat

SteeringSteeringWheelWheel

Page 47: Seven Steps to Better PHP Code

class Car{ protected $engine; protected $steeringWheel; protected $frontSeat;

public function __construct() { $this->engine = new Engine(); $this->steeringWheel = new SteeringWheel(); $this->frontSeat = new Seat(); }}

Page 48: Seven Steps to Better PHP Code

class Car{ public function __construct(Engine $engine, SteeringWheel $steeringWheel, Seat $seat) { $this->engine = $engine; $this->steeringWheel = $steeringWheel; $this->frontSeat = $seat; }}

Page 49: Seven Steps to Better PHP Code

$engine = new Engine();$steeringWheel = new SteeringWheel();$seat = new Seat();

$car = new Car($engine, $steeringWheel, $seat);

Page 50: Seven Steps to Better PHP Code

$engine = new SuperStrongEngine();$steeringWheel = new FancySteeringWheel();$seat = new MichaelSchuhmacherRacingSeat();

$car = new Car($engine, $steeringWheel, $seat);

Page 51: Seven Steps to Better PHP Code

Favour composition Favour composition over inheritanceover inheritance#6#6

Page 52: Seven Steps to Better PHP Code

AvoidAvoidinheritance.inheritance.

Page 53: Seven Steps to Better PHP Code

SuperglobalsSuperglobalsConstantsConstants

SessionSession

ConfigurationConfigurationDatabaseDatabase

WebserviceWebservice

Class to TestClass to Test

Page 54: Seven Steps to Better PHP Code

If it's not tested,If it's not tested,it does not existit does not exist

Page 55: Seven Steps to Better PHP Code

Make it easyMake it easyto (unit) testto (unit) test#7#7

Page 56: Seven Steps to Better PHP Code

Fewer Fewer dependencies.dependencies.

Page 57: Seven Steps to Better PHP Code

TestableTestable==

MaintainableMaintainable

Page 58: Seven Steps to Better PHP Code

TestableTestable==

ExtensibleExtensible

Page 59: Seven Steps to Better PHP Code
Page 60: Seven Steps to Better PHP Code

Thank you.Thank you.

Page 61: Seven Steps to Better PHP Code

Copyright © 2009 thePHP.cc, Germany

Contact■ http://thePHP.cc■ http://www.priebsch.de■ http://www.slideshare.net/spriebsch■ http://twitter.com/spriebsch■ [email protected], IRC: spriebsch

Page 62: Seven Steps to Better PHP Code