You can't hate PHP properly unless you use it. But you also can't hate PHP properly unless you use other languages. If you don't use PHP first hand, then you don't know it well enough to appreciate what's truly wrong with it. And if you don't use and know other languages well enough, then you don't appreciate how much better PHP could have been if it wasn't so horribly designed.
So thinking PHP is horrible without ever having ever used it is as bad as thinking PHP is good without ever having used anything better.
Aye, while reading the epic Eevee's epic PHP rant recently it struck me how much it heightened my appreciation for all the things better-designed languages managed to get right, and all the things they managed to avoid.
The amount of sheer genericity, that is consistent reuse of concepts and freedom of expression stemming from wide application of simple rules, in something like Python is staggering compared to the myriad problems he lists with things like PHP's object model, built-in types, assignment mechanics, etc.
I started out doing web development in PHP in the 90s and then eventually graduated to desktop application work in C++ and finally added Python (on the desktop and also again for the web) to the mix in the last half-decade, and while I realized quickly that these were better languages and that they were much more fun to use due to the features they offer and the way things just click into place, Eevee's post was a fun tour of all the little whys.
Then again, Python 2.x's ordering rules - falling back to alphabetical collation of the type names when objects can't be ordered otherwise - almost smells of PHP-style implicitness :). Good thing that was made more strict in Python 3.
Not to make this into a 'my language is better than yours' debate because we all know how annoying those are, but imo once one has used enough languages, one realizes that all of them have good and bad things. Like you I'm mostly a C++ developer nowadays, and C++ has plenty of warts, but like PHP, the advantages outweigh the disadvantages (for me). Now one can say that I picked the two worst languages as examples (and to base my career on), and certainly PHP and C++ are the two languages that are most crapped upon nowadays, but at the same time they're also the most popular ones. Other languages that I've used all show not so nice aspects, even after not all that intensive use.
To take your Python example: I recently wrote a small Python application because in that context, Python was the obvious choice. Turns out that instantiating an object of a variable class name is quite non-intuitive (I don't even remember how it was done, it was typically something you need to look up every time you use, much like the syntax of calling a member function through a function pointer in C++ - I looked that up so often that I know by heart now that it's on page 219 of the 2nd edition of the Stroustrup - but I disgress...). Whereas in PHP it's simply $classname = 'AClass'; $a = new $classname(); . Completely obvious and in line with the way everything else works in PHP.
Again this is not to diss Python, I like some of the things of it that it does differently than other languages and there are many people doing great things with it. It may even well be that in the aggregate, Python has less 'annoyances' or rough parts than PHP, I don't know. It's just an example to illustrate that things are never black or white, and IMO the whole 'I hate XYZ' is widely overblown, because really, life is too short to get one's panties in a bunch over a stupid programming language, of all things. Sure I am annoyed with bad tools, but hating them and spending hours and hours crusading against them... That's the ultimate waste of time, im (maybe not even so h) o.
First of, let me say that I absolutely agree with your opening statement: I find that with every new language I learn, as long as it is at least somewhat viable and a little different from those I used before, it makes me a better programmer in all the languages I already know, because I get to think about problems in terms of the sum of all these languages and be more reflective and realistic about their strengths and weaknesses. A little programmer Sapir-Whorf going on there maybe?
As for your Python example of instanciating a class by a string - well. I realize this is going to be the groan-I-knew-someboy-was-going-to-do-it response, but I can't resist listing some imho not-so-hard ways to do this anyway:
- If you know the namespace the class is in, say your locals or globals, you can instanciate it by indexing the dictionaries returned by globals() or locals() respectively, say: globals()['classname'](constructor arguments)
- If the class is in a module, it's an attribute of the module object. If your class is nested in another class (or class instance), it's an attribute of the class (or one of its instances). Then you can do an attribute fetch by name string using the built-in getattr() function: getattr(module or any other object, 'classname')(constructor args)
- If two ways of doing this already sounds like too much, there's vars(): Without an argument it's identical to locals(), with an object as argument it returns that object's naemspace dictionary, which you can then index: vars(nothing or module or any other object)['classname'](constructor args)
- Of course, since classes are just objects, you can also add them to a container, and then access them that way. I.e. you can do: adict = { aclass.__name__ = aclass } and then adict['aclass'](constructor args)
IMHO, these examples demonstrate the same sort of "in line with the way everything else works in Python" property: Objects have namespace dictionaries that store their attributes. Attributes reference objects. Classes are objects. Modules are objects. Dictionaries are objects and reference objects.
And this sort of consistency is something Python is, for the most part, really really good at. Cf. the simple rules for assignment consistently popping up everywhere: Your regular assignment operation, function argument passing, loop variable assignment, and so on. And since assignment in Python can do impressive things (say, iterable unpacking: a, b, c = [1, 2, 3] - even nested, very handy to unpack lists of lists in a loop) the fact that it's used postively everywhere brings great power, from simple rules. That's what I meant.
No, truth be told, Python is not without its warts either. The idiotic ordering in Python 2.x I mentioned earlier is one such example (thankfully now fixed in version 3 of the language, along with a slew of others). The somewhat ugly exception of classes that use "slots" to store their attributes rather than namespace dictionaries are another (still around even in v3, though thankfully used only rarely, and built-ins like getattr() and vars() work the same on them and their instances regardless) are another. But compared to PHP ...
So thinking PHP is horrible without ever having ever used it is as bad as thinking PHP is good without ever having used anything better.