O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

Decoupling Objects With Standard Interfaces

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Próximos SlideShares
Asynchronous I/O in PHP
Asynchronous I/O in PHP
Carregando em…3
×

Confira estes a seguir

1 de 53 Anúncio

Mais Conteúdo rRelacionado

Diapositivos para si (20)

Semelhante a Decoupling Objects With Standard Interfaces (20)

Anúncio

Mais recentes (20)

Anúncio

Decoupling Objects With Standard Interfaces

  1. 1. IPC Spring 2013IPC Spring 2013 Decoupling Objects With Standard Interfaces
  2. 2. About MeAbout Me ● Thomas Weinert ● papaya Software GmbH ● papaya CMS ● Twitter: @ThomasWeinert ● Web: http://www.a-basketful-of-papayas.net
  3. 3. InterfacesInterfaces ● By Declaration ● By Convention ● Magic Methods
  4. 4. ReasonsReasons ● Encapsulation ● Reuse ● S.O.L.I.D.
  5. 5. ImplementImplement class Foo implements Countable, IteratorAggregate { }
  6. 6. ExtendExtend interface Foo extends IteratorAggregate { }
  7. 7. ValidateValidate if ($foo instanceOf Traversable) { }
  8. 8. Type HintsType Hints function bar(Traversable $foo) { }
  9. 9. InterfacesInterfaces By Convention
  10. 10. Object InitializationObject Initialization ● Magic Methods ● __construct() ● __destruct() ● __clone() ● __sleep()/__wakeup() → Serializeable ● __set_state()
  11. 11. __toString__toString ● Cast an object to string /** * Casting the object to string will *return the last value * @return string */ public function __toString() { return (string)end($this->_values); }
  12. 12. Dynamic PropertiesDynamic Properties ● $object->value = 123 ● $value = $object->value; ● $object->setValue(123); ● $value = $object->getValue();
  13. 13. Dynamic PropertiesDynamic Properties ● __isset() ● __get() ● __set() ● __unset()
  14. 14. __isset()__isset() /** * @param string $name * @return boolean */ public function __isset($name) { switch ($name) { case 'name' : case 'value' : case 'values' : return TRUE; } return FALSE; }
  15. 15. __get()__get() /** * @param string $name * @throws InvalidArgumentException * @return mixed */ public function __get($name) { switch ($name) { case 'name' : return $this->_name; case 'value' : return end($this->_values); case 'values' : return $this->_values; } throw new LogicException( sprintf( 'Can not read non existing property: %s::$%s', __CLASS__, $name ) ); }
  16. 16. __set()__set() /** * @param string $name * @param string|array|Traversable $value * @throws LogicException */ public function __set($name, $value) { switch ($name) { case 'name' : $this->setName($value); return; case 'value' : $this->setData((string)$value); return; case 'values' : $this->setData($value); return; } throw new LogicException( sprintf('Can not write non existing property: %s::$%s', __CLASS__, $name ...
  17. 17. __call/__callStatic__call/__callStatic Dynamic Methods/Functions
  18. 18. Generic CallbacksGeneric Callbacks class MyEvents extends Events { public function __construct() { parent::__construct(['example' => 21]); } } $my = new MyEvents(); echo $my->onExample(), "n"; //21 $my->onExample = function () { return 42; }; echo $my->onExample(), "n"; //42 $my->onExample = 23; echo $my->onExample(), "n"; //23
  19. 19. PHP DocumentorPHP Documentor /* * … * * @property Callable $onExample * @method mixed onExample() */ class MyEvents extends Events { public function __construct() { parent::__construct(['example' => 21]); } }
  20. 20. CallableCallable ● 'function' ● array($object, 'method') ● function() {} ● class {}
  21. 21. __invoke__invoke ● Functors ● Callable
  22. 22. Callback ListsCallback Lists ... $queries = IoDeferred::When( $mysqlOne("SELECT 'Query 1', SLEEP(5)") ->done( function($result) use ($time) { var_dump(iterator_to_array($result)); var_dump(microtime(TRUE) - $time); } ), $mysqlTwo("SELECT 'Query 2', SLEEP(1)") ->done( function($result) use ($time) { var_dump(iterator_to_array($result)); var_dump(microtime(TRUE) - $time); } ) );
  23. 23. Functor ExampleFunctor Example class DatabaseResultDebugger { private $_startTime = 0; public function __construct($startTime) { $this->_startTime = $startTime; } public function __invoke($result) { var_dump(iterator_to_array($result)); var_dump(microtime(TRUE) - $this->_startTime); } }
  24. 24. Callback HandlersCallback Handlers $queries = IoDeferred::When( $mysqlOne("SELECT 'Query 1', SLEEP(5)") ->done( new DatabaseResultDebugger($time) ), $mysqlTwo("SELECT 'Query 2', SLEEP(1)") ->done( new DatabaseResultDebugger($time) ) );
  25. 25. More Callback HandlersMore Callback Handlers $queries = IoDeferred::When( $mysqlOne("SELECT 'Query 1', SLEEP(5)") ->done( new ConcreteDatabaseResultHandler() ) ->done( new DatabaseResultDebugger($time) ), $mysqlTwo("SELECT 'Query 2', SLEEP(1)") ->done( new DatabaseResultDebugger($time) ) );
  26. 26. Predeclared Interfaces
  27. 27. SerializeableSerializeable ● Usage ● serialize($object) ● unserialize($string); ● Methods ● $object->serialize() ● $object->unserialize($string);
  28. 28. JsonSerializableJsonSerializable ● Usage ● json_encode() ● Method ● $object->jsonSerialize()
  29. 29. ArrayAccessArrayAccess ● [] -Syntax ● Validation ● Conversion ● Lazy Initialization
  30. 30. ArrayAccess MethodsArrayAccess Methods ● offsetExists() ● offsetGet() ● offsetSet() ● offsetUnset()
  31. 31. OffsetExists()OffsetExists() /** * @param integer $offset * @return boolean */ public function offsetExists($offset) { return array_key_exists($offset, $this->_values); }
  32. 32. OffsetGet()OffsetGet() /** * @param integer $offset */ public function offsetGet($offset) { return $this->_values[$offset]; }
  33. 33. OffsetSet()OffsetSet() /** * @param integer $offset * @param string $value */ public function offsetSet($offset, $value) { if (NULL === $offset) { $this->_values[] = $value; } else { $this->_values[$offset] = $value; } }
  34. 34. OffsetUnset()OffsetUnset() /** * @param integer $offset */ public function offsetUnset($offset) { unset($this->_values[$offset]); }
  35. 35. Array DereferencingArray Dereferencing echo $object->foo()[0];
  36. 36. CountableCountable ● count($foo) class DatabaseResult implements Countable { ... public function count() { return $this->_count; } ... }
  37. 37. TraversableTraversable ● foreach ● Iterator ● IteratorAggregate
  38. 38. Iterator InterfacesIterator Interfaces Traversable Iterator OuterIterator IteratorAggregate RecursiveIteratorSeekableIterator SPL
  39. 39. Iterator functionsIterator functions ● foreach() ● iterator_to_array() ● iterator_count() ● iterator_apply()
  40. 40. IteratorIterator ● rewind() ● next() ● valid() ● current() ● key()
  41. 41. IteratorAggregateIteratorAggregate ● getIterator() class Foo implements IteratorAggregate { private $_items = array(); public function __construct(array $items) { $this->_items = $items; } public function getIterator() { return new ArrayIterator($this->_items); } }
  42. 42. Predefined IteratorsPredefined Iterators ● ArrayIterator ● EmptyIterator ● RegexIterator ● …
  43. 43. Nest IteratorsNest Iterators ● IteratorIterator ● AppendIterator ● CallbackFilterIterator ● ...
  44. 44. RecursiveIteratorRecursiveIterator ● List with Children $items = [ 1 => '1', 2 => '1.1', 3 => '2' ]; $structure = [ 0 => [1, 3], 1 => [2] ];
  45. 45. Inherit from IteratorIteratorInherit from IteratorIterator class Bar extends IteratorIterator implements RecursiveIterator { private $_items = []; private $_structure = []; public function __construct($items, $structure, $parent = 0) { $siblings = []; if (!empty($structure[$parent])) { foreach ($structure[$parent] as $id) { if (isset($items[$id])) { $siblings[$id] = $items[$id]; } } } parent::__construct(new ArrayIterator($siblings)); $this->_items = $items; $this->_structure = $structure; } ...
  46. 46. hasChildren()hasChildren() public function hasChildren() { return $this->valid() && isset($this->_structure[$this->key()]); }
  47. 47. getChildren()getChildren() public function getChildren() { if ($this->hasChildren()) { return new $this( $this->_items, $this->_structure, $this->key() ); } else { return new $this([], []); } }
  48. 48. RecursiveIteratorIteratorRecursiveIteratorIterator ● Iterator for RecursiveIterator $iterator = new RecursiveIteratorIterator( new Bar($items, $structure), RecursiveIteratorIterator::SELF_FIRST ); foreach ($iterator as $element) { echo str_repeat('*', $iterator->getDepth() + 1); echo $element; echo "n"; }
  49. 49. ResultResult * 1 ** 1.1 * 2 ● No recursive function call ● Works with Traversable/ArrayAccess ● Allows for Lazy Initalization
  50. 50. ObserverObserver Subject Observer 2 Observer 2Observer 2
  51. 51. ObserverObserver CMS Page published Log Action Announce To Webservice Invalidate Cache
  52. 52. ObserverObserver ● SplObserver ● update() ● SplSubject ● attach() ● detach() ● notify()
  53. 53. Thank YouThank You ● Twitter: @ThomasWeinert ● https://joind.in/8807

×