Why PHP Sucks

“Recalling the exact syntax for the built-in stab() function, you make a sane assumption and call shoot(GUN, FOOT); The foot shoots your gun.”
— Some user who calls theirself “plams” on the Something Awful Forums

This is a list of reasons I don't like PHP.

Some reasons involve actual deficiencies in PHP; others involve features that other programming languages provide that PHP has no reason not to provide.

When I speak of "other languages", I'm thinking primarily Perl, Ruby, and Python1, that sort of thing.

Common Arguments In Favor of PHP

“PHP is easy to deploy.”

True, but once you select a programming language and templating system, getting it installed on a system shouldn't take any more than an hour. And I'm including worst-case scenarios here.

And this is a one-time operation. If you have to do it on a few hundred machines, it can easily be automated. When hundreds if not thousands of man-hours are going to be spent doing actual coding, is the time you spent installing a programming language and templating system really an issue?

“PHP is easier to pick up than Perl/Python/Ruby/etc.”

Picking up the basics of just about any language isn't that hard. Picking up proper coding practices that promote maintainability, security, simplicity, resiliency, etc. in any language requires time and experience. Most coders who have this kind of experience will have no problem picking up a new language. Most coders who don't have this kind of experience will write crappy code for a while, no matter what language they use.

One thing about PHP's documentation. It's incomplete. User-provided comments in the online documentation are frequently inaccurate. Arguably, this actually hinders one's ability to learn how to write proper PHP.

“More people know PHP than Perl/Python/Ruby/etc.”

This is probably true, but do more good programmers know PHP than Perl/Python/Ruby/etc.? If they can't pick up other languages, do you really want to hire them?

“PHP makes it easy to build web sites!” a/k/a “PHP provides templating and embedding of code with HTML built-in!”

Let's throw aside for a moment the argument that this is not a good feature for building larger systems because it encourages the mixing of business logic and presentation code (though you can easily develop habits to avoid this).

This is arguably true, but systems that provide templating and embedding of code in HTML exist for other languages.

It's just that PHP is the only one that provides such a system built-in.

There are many based on Perl. I'd choose Mason, but there are Template Toolkit, and millions more.

For Python there is Spyce.

Specific Reasons Why PHP Is Inferior to Other Languages

The ternary operator

In most programming languages the ternary operator is right-to-left assocative. This allows you to write things like this:

print((foo == 1) ? "uno" : (foo == 2) ? "dos" : "tres");
print("\n");

This chunk of code obviously outputs the word uno.

PHP's implementation of this operator has left-to-right. I dare you to guess what the following PHP snippet outputs:

<?php
    $foo = 1;
    print(($foo === 1) ? "uno" : ($foo === 2) ? "dos" : "tres");
    print("\n");
    # (I use the === operator out of good habit.)
?>

Hint: it's not the word uno.

The || and && operators

In non-retarded programming languages, they return either the result of the left operand or the result of the right operand.

In PHP, 5 || 4 returns 1. 0 || 6 returns 1.

While most people use || as a "default value" operator:

$foo = $bar || "default value";

this cannot be done in PHP.

Invoking external programs

PHP does not provide multi-argument forms of system(), exec(), or other built-in functions. There is the pcntl extension, which is not enabled by default.

Higher-Order Programming

If you're forced to use a version of PHP older than 5.3, you don't get closures.

Other Issues

In PHP, the names of built-in functions are inconsistent. Is it isset() or is_set()? Is it isnull() or is_null()? Is it sort() or array_sort()? Is it merge() or array_merge()? Even I don't remember. I have to look up the PHP documentation to answer these. I'll let you do the same.

The arguments to built-in functions are inconsistent.

The built-in functions' return values are inconsistent.

The number of built-in functions is too large. Do we really need 11 sort functions (scroll down)?

Function names are case-insensitive, but variable names are case-sensitive. WHY?

As I've stated above, the vast majority of official and user-contributed documentation is poor.

PHP's authors have made a few non-backward-compatible changes to the language. Not just between PHP4 and PHP5, but in minor point releases of PHP4.

Magic Quotes

There is also the fact that PHP ever had the magic_quotes feature in the first place. While it's been turned off by default for quite some time, and will be removed from PHP 6, it will still affect you for some time to come in the following situations:

  1. When writing programs to distribute to other people who may be running PHP4 or PHP5. Such as yet another forum or CRM package.
  2. When writing programs you may port from one operating system to another someday. Even if both are running the same version of PHP...

...You see, there's one particular PHP feature called magic_quotes_gpc, where things get "interesting". It is on by default in PHP4. It is off by default in PHP5 on certain Linux distributions; on in others. You can probably stick "php_flag magic_quotes_gpc" off in apache.conf or .htaccess. But some shared-hosting providers make this impossible. In the worst case, you may very well have to pollute your code with things like this. (There are common techniques such as ereg_replace("/\\/", "") that a lot of programmers use, which do not work right in all cases.)

If You Must Use PHP

Advanced PHP Programming by George Schlossnagle should be required reading.

When doing database programming, learn how to use prepared statements. It will make your code more secure, and you will soon discover that you are much happier. Chances are, you will need to use an abstraction layer such as PEAR Database or ADOdb or PHP Data Objects. PHP5's mysqli_* functions also support prepared statements, but there is almost never a reason to use RDBMS-specific functions.

Start using a templating engine. Use it to separate your business logic from your presentation. You will discover that you are happier when you do this. For most projects, you don't need a large package like Smarty. This public-domain system in 40 lines of PHP code will do you just fine.

Other Anti-PHP Sites

Things I Like About PHP

  • The fact that within the body of a function, variables are local by default. You have to use the global keyword if you want to actually modify global variables. No other language in widespread use, to my knowledge, has this feature. It was definitely borne of wisdom.

Footnotes

1 Python does have one rather silly limitation on anonymous lambda functions: they can only use one line and can only contain a single expression, not a series of statements. Nested named functions are first-class objects though; they're not anonymous, but they'll work. List comprehensions are also useful, but I haven't much experience with Python, nor with list comprehensions in any language.