Download - Seven Steps to Better PHP Code

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