Re: [VOTE] Scalar Type Hints
| From: | Andrea Faulds | 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/