> -----Ursprüngliche Nachricht-----
> Von: Nikita Nefedov [mailto:[email protected]]
> Gesendet: Donnerstag, 12. Februar 2015 15:54
> An: Andrea Faulds
> Cc: Pavel Kouřil; PHP Internals
> Betreff: Re: [PHP-DEV] [VOTE] Scalar Type Hints
>
> Hi,
>
> 2015-02-12 18:31 GMT+04:00 Andrea Faulds <[email protected]>:
>
> > Hi Pavel,
> >
> > > On 12 Feb 2015, at 13:48, Pavel Kouřil <[email protected]> wrote:
> > >
> > > C# does have dynamic typing.
> >
> > No it doesn’t, it’s a statically-typed language. I don’t understand
> > why you say it has dynamic typing - there is some limited dynamism in
> > parts, but I don’t think it affects what we’re talking about. Dynamic
> > typing and polymorphism aren’t the same.
> >
>
> C# actually supports dynamic typing with a dynamic keyword [1]. But it
> really doesn't mean that having method
> overloading in a dynamic language is a good idea... C#, although it has a
> full ability to support dynamic typing, is not usually
> used in this fashion. To understand why it's not the best idea to use dynamic
> types with overloading you can just google
> "C# dynamic type with overloading site:stackoverflow.com".
>
> Another great deal in this question is performance, I think this subject was
> brought up a plenty of times in this ML and it
> was pointed out a couple of times that overloading even if doable at some
> point, would harm performance of method calls,
> which are already one of the slowest (if not the slowest) OPs in the engine.
> Languages like C# are usually able to resolve
> method references at compile time (unless virtual methods are used, even then
> it's only a matter of choosing right method
> from hierarchy not from all the overloaded variants).
>
> [1] https://msdn.microsoft.com/en-us/library/dd264736.aspx
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. 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.
Cheers,
Robert
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php