2017-03-11 17:24 GMT+01:00 Michael Vostrikov <michael.vostri...@gmail.com>:

> > 'Order does not match OrderForCheckout. Reason: ...'.
>
> Sorry, this is text for second example) I missed this moment. But I think
> the idea is clear.
>
>
> For manual call of __match() type casting can be used:
> $orderForCheckout = (OrderForCheckout)$order;
>
>
> Also this feature can be used for checking enum values or intervals.
>
> class Value
> {
>     public $value;
>
>     public function __construct($value)
>     {
>         $this->value = $value;
>     }
> }
>
> class State variant of Value
> {
>     const ACTIVE = 1;
>     const INACTIVE = 2;
>
>     public function __match()
>     {
>         return in_array($this->value, [self::ACTIVE, self::INACTIVE]);
>     }
> }
>
> function setState(State $s)
> {
>     ...
> }
>
> setState(new State(3));
>
> In constructions like "new State($value)" __match() can be called after
> __construct().
>
>
> If to add a possibility to use data types, class Value will not be needed:
>
> class State variant of integer
> {
>     ...
>     public function __match()
>     {
>         return in_array($this, [self::ACTIVE, self::INACTIVE]);
>     }
> }
>
> setState(3);
>

IMHO the real life implementations always differ, in another case, they
would be the same.
Example with Rectangle and Square IMO is an example of bad naming in this
case.
I rather want to call it Quadrangle and have one implementation or event do
the simplest inheritation.
But I may be wrong.

-- 
regards / pozdrawiam,
--
Michał Brzuchalski
about.me/brzuchal
brzuchalski.com

Reply via email to