
PHP Sadness - stesch
http://phpsadness.com/
======
skrebbel
Not to take anything away from this post because PHP is a mess, but yesterday
I dragged and dropped some PHP files onto a server with FileZilla, opened the
right URL in a browser and it worked. No bundler, no docker, no kubernetes.

That was some PHP Happiness right there.

~~~
kijin
I also like the single-threaded, shared-nothing architecture that PHP
inherited straight from the CGI days. Every request is guaranteed to start in
a clean state. It's amazing that PHP 7 is as fast as it is even while sticking
to the execution model of a shell script.

I wish I could run Python or JavaScript this way without losing too much
performance.

~~~
skrebbel
Yeah me too! Essentially PHP is a purely functional programming language in
the Rich Hickey sense ("If a tree falls in the woods, does it make a sound? If
a pure function mutates some local data in order to produce an immutable
return value, is that ok?").

PHP is like React on the server side, since the HTML output is a pure function
of the request (and external state in eg a database of course). I like to
think that it's no wonder that React got invented in a company totally built
on PHP. Someone must've complained "I just want to change the URL and rerender
the entire page with every user action, not mess around in jQuery". Someone
else said "But that won't be fast enough!" and then someone must've gone "Hmm,
but couldn't we _make_ it fast enough?"

~~~
dsego
Actually, the story about PHP inspiring React is totally correct, at least I
remember reading it somewhere when React just came out. Also Composer inspired
Yarn, the NPM alternative.

~~~
symlinkedtonull
Regardless of PHP's warts, Composer is definitely something worth emulating.

------
hochchristoph
To me it's amazing how many of these things have been fixed in the last couple
releases of PHP. They worked really hard to fix the flaws, and still there's
more coming, like property types.

One thing I'm particular exited about is the "Preloading" RFC
([https://wiki.php.net/rfc/preload](https://wiki.php.net/rfc/preload)), which
fixes one of PHP's oldest weaknesses: That code that is used on every request
has to be loaded everytime a request comes in. Sure, thanks to Opcache a file
only has to be compiled once, but the loading of the compiled classes into
memory still makes for some overhead. With Preloading, if you use a framework
like Laravel or Symfony, all core framework classes could be loaded once on
PHP startup.

------
arkh
> The point of private methods is to prevent what other code can call them.
> However, in PHP, you also cannot override private methods in a subclass.
> This is especially important when, for example, trying to build mocks in
> unit tests.

You may not be testing the right things if you have to override your methods
just for your tests.

~~~
josteink
Also: many languages prevent all access to private members in derived classes.
This is by design: private is _private_.

If you need derives classes-only to have access, you should typically use the
“protected”-modifier.

Doesn’t php have that?

~~~
dsego
It does.

~~~
josteink
So the PHP sadness in this case refers to lacking PHP knowledge of the person
who wrote this blog?

------
ransom1538
To be honest, for a 23 year old language, that isn't a large list. With python
2vs3 I could write a book.

One issue:

"The point of private methods is to prevent what other code can call them.
However, in PHP, you also cannot override private methods in a subclass. This
is especially important when, for example, trying to build mocks in unit
tests."

That is called "protected". With protected you can override the method.
"private" means it is private to that class overriding - I believe this was
concept was extracted from C++.

"In general, you don't want to break any encapsulation for the sake of testing
(or as Mom used to say, "don't expose your privates!"). Most of the time, you
should be able to test a class by exercising its public methods. If there is
significant functionality that is hidden behind private or protected access,
that might be a warning sign that there's another class in there struggling to
get out."

------
mrunkel
For me the biggest stumbling block is always the inconsistency in the standard
library of function calls.

Without an IDE, I'd be constantly looking up function names and parameter
order.

Also, knowing which functions return a result and which modify a passed
parameter is also problematic.

I wonder if a case couldn't be made for creating a new "standard library" that
would operate alongside the existing one (for backwards compatibility).. A bit
like mysql and mysqli....

~~~
PunchTornado
I haven't coded without an IDE in 8 years. SO this is not an issue.

The same can be said about Java, nobody would write all that glutter without
an IDE...

~~~
buboard
I use vim exclusively and tbh i would love a solution for this. it seems there
are plugins for that, but i wonder whether they could become part of the
official vim package.

~~~
symlinkedtonull
Maybe just use a real IDE? Not sure why so many developers insist on hampering
themselves for no good reason.

~~~
buboard
i m honestly faster with vim , except for the times that i need to switch
files etc.

------
conradfr
Nowadays I do mainly PHP7.x / Symfony projects and of all this list I would
say only "ternary operator associativity" could potentially be a day to day
concern, and yes, empty() has gotchas.

Nothing listed is false, sure, and I'm sure there's people doing complicated
things with clever code like "declaring a function called __lambda_func()
(which) completely breaks create_function()" but I have not encountered it in
the wild, or not for a long time.

Frankly I have more problems with Composer memory allocation in VM/containers
than anything on this list.

------
chx
Yeah, yeah, more PHP bashing. But PHP has very nicely cleaned up since oh 5.3
or so and with every release it's getting better. For example, to bemoan
"Declaring a function called __lambda_func() completely breaks
create_function()" completely ignores the fact noone should (or does) use
create_function() since the introduction of proper closures.
[http://phpsadness.com/sad/2](http://phpsadness.com/sad/2) is made up too,
just use a constructor. There truly is no problem with PHP any more if
properly used. Yeah we can rehash the arguments from the last twenty years but
instead -- have you seen the language where the community and culture is so
fractured someone could sneak in a bitcoin wallet stealer without anyone
detecting it? The language which insists that the completely different
concerns of backend and frontend development should be done in the same
language? Now, that's what ridiculous!

~~~
seba_dos1
Not sure if that's intentional, but take notice of how you're fighting for
credibility for a language with bad reputation by comparing it to the one
other language with similarly bad reputation :P

------
perpetualcrayon
Generally speaking, if you expect the world to (as a first class principle)
cater to your personal desires you will always be sad.

I didn't read the whole thing, but I'd be interested if anyone found any issue
that doesn't have a workaround or can't be polyfilled to cater to this guy's
expectations.

Edit: "reasonable" expectations. Requiring semicolon at end of line? smh Write
your own editor plugin that inserts your semicolon (or write a preparser). PHP
folks only wrote an entire language for the world to use for free. The least
you could do (if it's really that big of a deal) is write a preparser.

------
invalidusernam3
Some of these are good points, but the error reporting ones are a bit
pedantic.

Sure stuff like "T_PAAMAYIM_NEKUDOTAYIM" is confusing the first time you
encounter it, but after your first week of PHP you're going to have seen it
and know what it means. PHP has many flaws, but for me, error reporting isn't
one of them.

~~~
johannes1234321
That name is one for errors. I liked it since it was Googleable. Unique names
have benefits.

~~~
code_duck
If it was simply T_DOUBLE_COLON that would also be googleable. Even better,
you wouldn’t need to google it since it’s not in an obscure foreign language.

------
Vanderson
I recommended Python with a math library to my friend to try as a replacement
for R (and for server code running a project's backend data processing). The
amount of effort and time spent trying to get it up and running was
ridiculous.

R's syntax is very unpleasant for both of us, but it really gets the job done.
Php isn't nearly as bad as R, and I've seen this kind of criticism of php for
years.

What is the perfect language I should use then? Can't a list of "bad things"
be made of any language? (maybe not the same problems, but there's always
something)

~~~
code_duck
It’s true that deployment is more difficult on Python.

Comparing R to PHP seems kind of inappropriate since what they are appropriate
for rarely overlaps. I wouldn’t use PHP for statistics and I sure wouldn’t use
R for a website.

As far as whether other languages could have similar criticism, no. This is an
analysis of sloppy design at the core of PHP. The types of problems listed
aren’t found in Python or Ruby because they planned the language better in the
first place and have a better process for dealing with intelligent changes.
It’s maddening for me to read what PHP developers think about changes to the
language. If you want to use PHP, go ahead, but I don’t think that’s the point
of this article.

~~~
Vanderson
> _This is an analysis of sloppy design at the core of PHP._

I understand this, but the source or reason for the "bad list" doesn't change
the fact that every language has something off. (just a matter of degrees)

Also, php did something so right that even despite all the ugliness and
problems it's used a lot.

I think php should suck it up and make a branch to fix all of these things and
let people slowly change their apps over. I have gone through a lot of rework
over the years, what's one more change for better future?

~~~
code_duck
Sure, it’s a matter of degree. PHP has many worse degrees than the things
‘wrong’ with Python or Ruby. Nobody said a language has to be perfect, just
better. Of course other languages have flaws, but Python and Ruby have fewer
and less serious flaws.

It’s like if I said hey, we should live somewhere besides Moldova. And you
said but don’t Germany and France have flaws too?

As far as what they should do, yes, they should fix all of these problems. The
thing is many would break huge amounts of old code and cause problems for
people and harm upgrade adoption. Also, PHP developers, as seen, actually
insist on things like ‘=> is better than : because it’s the PHP Way’. I’m not
going to waste time trying to persuade the heathens behind PHP to turn it into
a normal language. Why would I? My opinion is that PHP is a fundamentally
braindead language. It’s like someone tried to make a quick and dirty
scripting language with C syntax and then changed it over into a crappy
version of Java with the help of a bunch of incompetent college students over
10 years for an audience of amateur programmers, which actually is exactly
what happened. I have no desire to use it for anything, ever.

~~~
Vanderson
Your argument reminds me of a debate I ran into about using pocket hole jigs.
The experts would make hand carved mortis and tenon joints and consistently
attacked and ridiculed pocket hole jigs. And said no professional would ever
use pocket hole jigs.

Ikea does a lot of business and I wish they'd use pocket holes on their
furniture instead of some of the ghastly connectors that fall apart.

Getting things done and running a business are primary goals of software...
There was a time when mysql was ridiculed mercilessly as well.

~~~
code_duck
You’re right about some aspects and I am about others. PHP is good for certain
projects. MySQL works well for some cases. However many experienced people
prefer other tools for good reasons.

Personally I grew weary of having this conversation about PHP and MySQL about
9 years ago (you’re aware of this long history, right? This is like talking
about the reasons for the civil war). Nobody needs to point out that WordPress
is build on PHP, or that Flickr used it, or god forbid Facebook.

The strengths and benefits relative to other software has been debated to
death in blogs, articles, forums, and mailing lists for a decade at least. I
doubt we can break new ground here.

Haven’t visited your website but I visited your profile. I’m assuming that you
are writing a CMS in PHP?

~~~
Vanderson
I generally agree there's probably no point in discussing this without an end
game. So here's one:

Do you believe that python/ruby/go/node.js/etc.. can replace php and do a
better job?

I haven't heard a recent apples to apples comparison, and the ones from the
past have faded in relevance because of improvements made in php. I suspect
that is because there are business reasons php runs circles around other
solutions, and that technical superiority doesn't mean financially superior.
(how many key google products run on javascript?)

If php is going to go away, it needs a jquery moment like this:

[http://vanilla-js.com/](http://vanilla-js.com/)

I am actively gutting all jquery from all my projects because it truly needs
to go away because something better came along to replace it. I haven't seen
that with php yet and I have looked because I want my business to stay running
and not fall behind because of a poor platform choice.

~~~
code_duck
Of course I believe that Python (etc) can replace PHP and do a better job.
Isn’t that the entire topic? There’s no question in my mind whatsoever. I
stopped using PHP in favor of Python in 2011 and would not consider reversing
that under any circumstances. I’m quite experienced with both languages and
PHP utterly lacks elegance. It’s not even close to something I’d consider
using or supporting. Not sure what your perspective is based on.

I mean, I’d never consider eating at McDonald’s under any circumstances
whatsoever, but somehow they stay open and people appear to patronize their
stores intentionally. So, tastes vary. If you like a bunch of dollar signs,
semi colons, illogically arranged standard library, endless inconsistencies
and poorly thought out syntax, don’t change a thing.

Where is PHP popular? Or standard? I’m not even sure what you’re referring to.
People still use PHP?

Hmmm... [https://www.codingdojo.com/blog/7-most-in-demand-
programming...](https://www.codingdojo.com/blog/7-most-in-demand-programming-
languages-of-2018/)

Okay, so it’s way behind Python, JavaScript, C# as far as common web
programming languages. Beating Perl. Sounds about right for something as
outdated as PHP.

My recommendation to you is to hurry up and learn how to setup your web server
for Python.

[https://hackernoon.com/top-3-most-popular-programming-
langua...](https://hackernoon.com/top-3-most-popular-programming-languages-
in-2018-and-their-annual-salaries-51b4a7354e06)

Here, Python is noted as surpassing PHP in popularity in 2017. I guess that
was the stack overflow survey. This is based on searching for 1 minute.

~~~
Vanderson
I am interested in making good choices for my business so I am taking your
feedback seriously.

 _-Popularity:_

I don't think it's wise to choose your platform on popularity. The masses make
terrible choices all the time. But at the same time I found numbers as high as
80% of the web is running php. (numbers can vary based on metrics, traffic
running php vs number of sites)

But then python is way less popular than javascript, so if I would accept your
argument on popularity shouldn't I use javascript with node.js?

 _-Standards:_

This is a more appealing argument to be made. But unfortunately I make custom
software for running websites, the standard is the output, html,css and js.
The backend is irrelevant to my users. This would only affect long term
maintenance, of which I am not seeing a jquery moment here.

Care to elaborate on why php is going to cause long term maintenance problems
or how it's non-standard in some way?

 _-Python can do a better job than php:_

I did a couple quick performance searches and just in the past couple years
php7 has made huge improvements in performance. What this says to me is that
php7 is being improved consistently.

Does python run websites better than php? If so, in what way? I couldn't see a
clear answer for this.

Also, since my customers never see or touch either python or php, I am not
sure how I could judge if python "does a better job" for my customers.

 _-Php is outdated:_

What is your metric for measuring something is outdated? I am not sure this is
possible with a programming language this is actively being improved and used.
Is this a popularity argument?

 _-Php is like McDonalds:_

While I don't eat at McDonalds, I can easily say that R is nasty to code with,
yet I am just fine dealing with it's idiosyncrasies because my friend does the
majority of the coding with it, and I help with cleanup and integration.

And python simply is not better enough (or at all) than R in every respect for
math processing. (this is from testing results from my friend who does
math/data analysis/statistics) It may be equivalent in some ways, but
certainly not better.

 _-Php is messy:_

The "bunch of dollar signs, semi colons..." argument would fit with javascript
as well (especially when mixed with libraries), so your arguments are
conflicting some.

Would my customers be better served if my codebase had a more simple syntax? I
am not sure this is even possible. But I am willing to hear arguments on this.

~~~
code_duck
You’re all set if you like what you’re using. I appreciate that you’re
thinking this through. I would prefer a language that was designed
intelligently from the ground up by experts, like Python. PHP seems to be
gradually emerging as a good design through trial and error, which is valid I
suppose.

------
dsego
The saddest part is that there is so much PHP code out there and it's mostly
really bad code. Even Rasmus isn't happy about it, you can watch his
presentations on state of PHP on youtube. PHP was meant to be a simple
templating language for HTML, and it failed miserably at that, which is why
almost every PHP framework out there invents another one.

~~~
wccrawford
>PHP was meant to be a simple templating language for HTML, and it failed
miserably at that

I would argue that it was _too good at that_ , instead. It was so good at
being a real language that people didn't just use it as a templating language
and it grew way, way bigger than initially intended.

When I see PHP templating libraries, they are all focused on restricting the
programmer from doing supposedly stupid things. They try to prevent logic from
leaking into the templates and utterly fail at it.

~~~
krapp
The problem is, the _templating_ part is what PHP is bad at.

That the programmer has to manually escape everything because PHP doesn't
actually know what HTML is, or else find a templating framework that does it
for them (like any other web-facing language), kind of demonstrates how badly
PHP fails at its "one job".

PHP has a lot going for it, but HTML templating isn't one of its strong
points.

On the upside, though, package management is sane and distributed by default,
and left-pad wouldn't happen in PHP-land.

------
tormeh
I used to be in contact with a licensed/bought piece of software written in
C++, PHP and Perl, using Mongodb as a database. It was about as much fun as it
sounds. Segfaulted twice a week.

I suppose at some point they'll make a plug-in system written in brainfuck.

------
dana321
One that was missed is the change in the way that the count function operates
on a null value, its breaking backwards compatibility.

The only way to solve it is to write your own count function and call it
everywhere instead.

Another problem is, if for example you are checking for a url variable to see
if it exists, there's more than one way to do it - and only one of those ways
is performant. Why have a special function that checks if a key exists when
its slower than just checking if the entire variable exists?

I've since moved on to C++ and go, but the ubiquity of php on web hosting will
bring me back to it again.

------
hansott
Reminds me of
[https://twitter.com/ircmaxell/status/984785734811963392](https://twitter.com/ircmaxell/status/984785734811963392)

------
z92
One can sort out a lot of PHP parameter order inconsistencies remembering that
if $haystack is an array then it's the second parameter after $needle. For
string it's the opposite.

    
    
        array_exists($needle, $haystack);
    

But

    
    
        substr($haystack, $needle);

~~~
kijin
You're probably thinking of in_array() and strpos(). Yeah, the names
themselves are confusing, not just the order of arguments.

I wish PHP was fully object-oriented so you could call a method on any array,
string, or number like in JavaScript. $haystack->contains($needle) is so much
more consistent! That would eliminate the need for most of those confusing
global functions, which can then be safely deprecated.

------
mykeels
This is good!

~~~
stesch
It's not one of those "LOL! PHP is so stupid!" articles.

He even took the time tagging which sad points are solved in newer versions.

~~~
accatyyc
Yeah, this guy actually PHPs, in contrast to most of the "php is so stupid"
people

------
kraag22
Again jokes about PHP? It's kind of old.

~~~
dsego
What's the joke?

------
bufferoverflow
Looks like many of the issues got fixed.

------
buboard
the inconsistent order of arguments is infuriating, but that has to some
extent been inherited from C

------
lbj
Honestly, if you use PHP you should expect sadness

~~~
stabbles
PHP has also its upsides:

\- High-quality packages (e.g. FlySystem or anything by
[https://thephpleague.com/](https://thephpleague.com/))

\- Very nice and mature frameworks such as Laravel.

\- Pretty good OOP features

\- No concurrency / async, which makes thinking about the code way easier than
sometimes in Node.js

~~~
buboard
what has the world come to be, where a series of commands actually running
like a series of commands is hailed as an upside.

~~~
ArchTypical
Same world since Multics.

------
IgorPartola
For me the biggest PHP sadness is always type coercion. ‘1’ and 1 are
different things. And coercion into an array when you suddenly use [] is just
insane.

~~~
alphadevx
It only appears to be "insane" if you are not used to working with
dynamically-typed languages. PHP has been dynamically-typed from the very
beginning, so you need to program defensively and check type at runtime (no
assumptions are safe).

~~~
IgorPartola
These days I do 99% of my work in Python3 and JS/ES6. PHP is still the most
insane version of this, though JS isn't far behind.

~~~
evilduck
Make the jump to including TypeScript in your toolchain, even if you don't
ever intend to write any TypeScript.

The type checking it does on regular javascipt is still beneficial in catching
and preventing a lot of coercion mistakes or attempting to accessing things
that are potentially undefined.

