2013/9/24 David Soria Parra <[email protected]>
> Lazare Inepologlou <[email protected]> schrieb:
> > I use anonymous classes very frequently in Java and in C#, and I would
> say
> > that they are quite useful. However the examples given in the RFC are
> > really bad ones. Why on earth would you need a constructor for an
> anonymous
> > class? Anonymous classes are used to implement quickly some interface.
> > Frankly, constructors are not part of any interface. Besides a
> constructor
> > is totally useless in an anonymous class as it will never be called after
> > the object is created.
>
> The need for anonymous classes in Java mostly comes from implementing
> interfaces on demand due to the lack of lamdas and the requirements of
> a strongly typed language. PHP has lambdas and it doesn't require you
> to match typing. Therefore I think the preferred way for most of the
> use cases is to use a lambda or if a bigger implementation is necessary,
> to give it a name. Due to namespacing you don't pollute the global scope
> anyway. Therefore I don't see much reason left as to why add anonymous
> classes and I really have a hard time finding a use case, except for trying
> to write PHP as you would write Java (which most likely is a bad idea).
>
>
There are many use cases where anonymous classes are useful, even in the
presence of lambdas. I use them quite often when dealing with graphical
interfaces and templates. Here is an example:
abstract class MyFancyHtmlListView extends UI {
protected function IsHeaderVisible(){ return true; }
protected function GetListItemMenu(){ return null; }
protected function OnItemClick( $item ){ }
protected abstract function RenderListItem( $item );
public function Render(){
// echo ...
}
}
With anonymous classes we could do something like this:
<?= new MyFancyHtmlListView(){
protected function IsHeaderVisible(){
return false;
}
protected function RenderListItem( $item ){
// echo ...
}
} ?>
The biggest advantage is that a missing RenderListItem could be statically
verified.
It is just a pattern that follows a different way of thinking: Instead of
having a list of parameters (including lambdas), we have standard methods
that take advantage of all the nice properties of OOP such as abstraction,
inheritance and polymorphism.
Lazare INEPOLOGLOU
Ingénieur Logiciel