Ask YC: Python vs. PHP
So far I have done all of my web programming in PHP. I've also recently learned Python and so far I find the syntax to be annoying (that might be because I'm just used to PHP). But I've heard a lot of buzz on these boards about using Python. Can anyone give me the quick laundry list of advantages/disadvantages for each?
49 comments
[ 2.1 ms ] story [ 110 ms ] threadNow more intelligently. It is very expressive (little code says a lot) and the code is really easy to read. If you already know how to program it takes a few hours to get your feet wet and from there the "batteries included" philosophy makes it easy to start writing real python.
More technically, my favorite features in no particular order:
- list comprehensions
- functions as first are first class objects (you can pass functions around just like any other piece of data)
- functional programming tools
- indentation determines scope (some dislike this, I don't like curly braces), and this makes the code look nice
- slice notation
- powerful native data structures (lists, dictionaries, sets)
- args and *kwargs
- awesome standard library
I could probably keep going...
P.S. No two stars next two each other allowed on news.yc?
not to mention I think there are cooler libraries out for python than for php, and it's more versatile (desktop apps, utility scripts) instead of just being web-centric
I haven't really done much in Python yet unfortunately, but I've worked quite a bit in Perl, PHP and Ruby, and personally I don't find any of them mind-blowingly different from one another, syntax aside. Some have more succinct syntax for looping and other things, but no major paradigm-shift IMO (like the one from imperative to functional).
Most of the complaints against PHP (just like MySQL) are about things that were solved years ago, but continue to linger on anyway. I like to think of PHP not so much as a language though, but more as a wrapper around C with memory management and a more flexible type system. Looking at PHP that way shows why many of its inconsistencies exist (e.g., in function names). It's also of the "structure is optional" philosophy, which requires more discipline to code well in.
Anyway, I think it comes down to figuring out whether it would save time now and later to use PHP or Python.
I just mean that really if you look at PHP's function list, it really is just a wrapper around C libraries. Many functions map 1-1 from the C lib to the PHP function. That's where it gets its string function names, many of the original database libraries were exactly that (which is why there was no built-in abstraction layer for so long), and you can look at GD or any other extension for more examples.
When you take that into consideration, you can see what the language designers were thinking in the decisions they made for PHP. They aren't necessarily the ideal choices, but the rationale does make sense.
As a language, aside from the fact that they're from the same syntactic family, one is a compiled, low-level iterative language, the other is an (semi-) object oriented, dynamic, garbage collected, interpreted language. In terms of language features, it's a lot closer to the Python, Ruby, Perl clan than C.
That is where many design limitations come from, and it's why PHP's standard library is still mostly just a collection of a million functions instead of something more OOP like the Python or Ruby :)
PHP isn't really even in the same branch of languages as the three popular dynamic languages. It's like a fork off from C in the same way that chimps and humans shared a common ancestor 8 million years ago. So, one could say, "chimps are to PHP as humans are to Perl", if one wanted to be inflammatory...and in this case, one does. Both are pretty flawed as creatures go, but one flings poop and the other drives cars and builds roller coasters.
http://php.net/array_map
http://php.net/array_reduce
http://php.net/array_filter
http://php.net/array_walk
http://php.net/call_user_func_array (apply)
http://php.net/create_function (lambda)
PHP is a language that encompasses all useful things in all other languages. Which, I guess, makes it inferior.
Once you have the function name (or an object method array) it can be stored in a variable with any name you want, passed around, etc. You can pretend it's a function all you want; you can check whether it seems like a real function with is_callable; and you can call it via call_user_func or call_user_func_array (this distinction made necessary because PHP lacks Python/Ruby *array unpacking syntax).
Somewhere I have a PHP class that lets you fake closure. You call Closure::Create($real_cb, $state_data) and it gives you a callback that, when called, calls $real_cb with $state_data plus all arguments that it was called with. And if $state_data is an array whose elements were assigned by reference, the 'closed-over' state is mutable.
So overall, it's a good pretense, even if foreach will always be faster than functional style.
By the way - can someone please try something like the following: $width = getimagesize($filename) [0];
The last time I checked, PHP threw a _Parser_Error_ for indexing an array that you just got from a function. Not even arrays feel like first class citizens.
(Pardon me, if this ward has been eliminated in the mean time. I just vividly remember losing some time hunting for a bug because of this 'feature'.)
Python syntax is much cleaner, and with only one way to do things, it's almost always easier to read. I'm a Pythonista now.
I actually started in Perl about 8 years ago (well, before that it was just little Galaga and Snake clones in DOS :), so it's kinda my first love. But Perl was eventually too punk rocker for me...
I drank the Ruby kool-aid for a while too (mmm, pickaxe flavour :), and if I were to start fresh in a language without the framework I'm used to now, I would definitely be seriously weighing Ruby vs Python (or maybe finally get up on the functional languages).
Maybe I'm writing Ruby like PHP, but I probably write PHP more like Perl anyway. When I first came to PHP I was disgusted at ideas like "register_globals" and immediately ported CGI.pm and DBI over so I would have something sane to work with in PHP. This was long before PHP had its "superglobals" and even PEAR didn't exist yet back then.
I was, of course, joking. Having a laugh at some of the obvious weaknesses in PHP, and pointing out that the other three popular dynamic languages go about things differently.
But, all but one of our world-facing websites are PHP applications (we run Wordpress, Joomla, FlySpray, and DokuWiki, our other wiki is the Perl-based TWiki). I'm actually a grudging fan of the language. It does a few things extraordinarily well, and I've been known to recommend that everyone building installable web applications ought to be writing them in PHP because of its pervasive availability.
Don't take it personally, folks. You're not going to convince me that create_function gives PHP first class functions (maybe if you squint a little), but you also don't need to convince me that it serves a niche very well. I don't have to like it, but I certainly have to use it, because it is currently the best tool for a large class of problems.
PHP is designed primarily as a web language. As such, it's pretty simple to get it up and running which is great for new web developers. The language itself, however, is pretty bad and programming concepts beyond syntax are better left to other languages. That said, I learned a lot with PHP and I think that dealing with it's idiosyncrasies and pitfalls has made me a better programmer overall.
Python, OTOH, is a general-purpose language that has recently gained popularity as a web language. It has greater applicability, but it's a little more difficult to get up and running on a web server. It's great for a new programmer, but not necessarily a new web developer. Since you already have a bunch of experience developing web apps, this is probably a non-issue.
We can debate advantages and disadvantages of the two languages all day. In the end, everyone is different and everyone has their own preferred language. Obviously, my language of choice is Python, Paul Graham is a LISPer, and I know someone who swears by PHP, even though he's used Python and Ruby/Rails. It doesn't matter. I say go ahead and give Python a shot. The worst that will happen is that you've added another tool to your toolbox.
http://docs.python.org/tut/
Python: +2
It would do you some good to learn a good PHP framework to rapidly build your app and get something out there immediately. A framework not only makes you look smart but it requires you to write code that does not merit you getting stabbed in your sleep. Ergo good PHP code.
Now we can all wax rhetoric that PHP does not support Functional idioms, brain dead functions, and name spaces. But in the interest of rapid prototyping and ease of deployment PHP comes first in mind. PHP frameworks now most notably Symfony(used by Yahoo to rewrite Delicious), CakePHP, Akelos, Kohana and my personal favorite CodeIgniter changed my opinion of PHP. You can easily abstract away logic using these frameworks. And they picked out some functions out of PHP's bewildering list of functions so that you have a solid base to work with.
So in a nut shell it's possible to write good PHP code but you have to exercise some discipline for it not to turn into spaghetti code.
Another reason you might want to carefully choose a language is the type of application you want for it. Let me explain, my company makes web based applications that customers can host within their corporate server. Now I don't want to waste much time trying to configure the server to run a specialize application. In fact I need something that can be installed and used right away in the shortest amount of time. So my choice of using PHP is more of a business decision as well.
So just weigh things out and ask yourself what do you wish to accomplish. Right tool for the right job.
edit: oh please consider reading this book http://www.manning.com/reiersol/ makes a good study on how to write good PHP code.
Just thought I'd mention that.
good luck.
Where can you point me to "better documentation than PHP"? This is a major difficulty for new people getting into Python-- the documentation is really quite poor and out-dated. My life would be much easier if the core Python documentation was nearly as good and organized as PHP or, even, MSDN.
What I really want is for every framework and language to have documentation as stellar as the user guide for the PHP framework Code Igniter: http://codeigniter.com/user_guide/
As a long time Python hacker, I'm used to using the interactive interpreter for my documentation needs (and then the source later). But that is absolutely not sufficient for newbies coming into Python-- they're lost in the arcane organization and formatting of the core Python documentation.
If you have a site that provides better core/comprehensive documentation than the official Python docs, let me know, as there are hundreds of Python scripters who would love it.
I disagree that the Python documentation is poor or out-dated. However, it is fragmented in what could be considered a confusing manner. I’ve often been searching for a particular piece of documentation, wondering if I should be looking in the tutorial, the library reference, or the language reference.
:-)
http://www.tnx.nl/php