Re: [VOTE] Scalar Type Hints

From: Date: Thu, 12 Feb 2015 16:49:39 +0000
Subject: Re: [VOTE] Scalar Type Hints
References: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17  Groups: php.internals 
Request: Send a blank email to internals+get-82545@lists.php.net to get a copy of this message
Hey Robert, > On 12 Feb 2015, at 16:15, Robert Stoll <php@tutteli.ch> wrote: > > There are several programming languages which do support dynamic typing and method overloading > somehow (Clojure, Erlang, Prolog, Cecil and certainly more). Most of them use a multi-method > approach and I think if PHP would introduce function/method overloading, then such an approach would > be appropriate. Interesting, I should maybe look into those. I’m not sure if all of those are really… “dynamic” as such. Are you sure the overloading you’re referring to there isn’t pattern-matching? > Right now, I need to implement the dynamic dispatching quasi myself which might be more verbose > but is also more cumbersome (and uglier IMO). Consider the following (fictional example): > > I want to write a Logger-Service which provides one public method "log" which writes > all kind of objects to a log. The corresponding classes do not all belong to my code base, are part > of third party libraries respectively, so I am not able to introduce some interface which all > classes implement. The strategy pattern is certainly a good idea for this problem but nevertheless, > somewhere I need to have the distinction based on many if/else with instanceof (latest in the > LoggerStrategyFactory) -- off topic, if someone has a better design approach to handle this problem, > then let me know it in a private message, would be interesting as well ;) > > class Logger{ > public function log($x){ > if($x instanceof Foo){ > logFoo($x); > }else if($x instanceof Bar){ > logBar($x); > } > //... > }else{ > throw new Exception("type ".gettype($x)." not supported"); > } > } > private function logFoo(Foo $f){ > //.. > } > private function logBar(Bar $b){ > //.. > } > //... > } > > With method overloading I could write the following, removing the hassle to write the dynamic > dispatch myself: > > class Logger{ > public log(){ > $this->_log($x); > } > private function _log(Foo $f){ > //.. > } > private function _log(Bar $b){ > //.. > } > //... > private function _log($x){ > throw new Exception("type ".gettype($x)." not supported"); > } > } > > Which is cleaner IMO. We could also add some sort of pattern-matching syntax which could do the same thing, but would have usefulness beyond merely dispatching to multiple methods. -- Andrea Faulds http://ajf.me/

« previous php.internals (#82545) next »