7 ms·
PHP Sadness
- mykeels 8y agoThis is good!
- mrunkel 8y agoFor 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 8y agoI 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 8y agoI 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 8y agoMaybe just use a real IDE? Not sure why so many developers insist on hampering themselves for no good reason.
- buboard 8y agoi m honestly faster with vim , except for the times that i need to switch files etc.
- conradfr 8y agoThey kind of did with the SPL.
- TheAceOfHearts 8y agoFun fact: when PHP was starting off it used strlen() as its function hashing mechanism, that's why function names are the way they are [0]. [0] http://news.php.net/php.internals/70691 http://news.php.net/php.internals/70691
- arkh 8y ago> 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.
- giancarlostoro 8y agoYeah you shouldnt override any existing code when doing unit testing, only updating properties if anything... Otherwise you are taking the code beyond its scope, if you need output from a method to be something specific... Just set the variable you are storing that methods return value into to what you need that output to be.
- viraptor 8y agoThis is nice in theory, but you need to design everything to work dependency injection style (or really have a setter for everything) to achieve this. Using a random number? Store the generator. Opening a file? Use a "FooOpener". ... Sometimes it's easier just to stub what you want.
- dhimes 8y agoYeah- Sometimes I've gotten lazy and returned an object that has all the private stuff attached. Once I've verified that it works, I quit returning that object, keeping the methods private for normal use. It gives me a clear logical delineation yet allows me to test while developing.
- arkh 8y agoIf you can't put the thing you're testing (method, class, application) in the state you want to test using only public methods you are not testing something useful. If you're doing to get 100% coverage be happy: that's dead code you can remove.
- 8y ago
- dsego 8y agoThe 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 8y ago>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 8y agoThe 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.
- hansott 8y agoReminds me of https://twitter.com/ircmaxell/status/984785734811963392 https://twitter.com/ircmaxell/status/984785734811963392
- kraag22 8y agoAgain jokes about PHP? It's kind of old.
- dsego 8y agoWhat's the joke?
- lbj 8y agoHonestly, if you use PHP you should expect sadness
- stabbles 8y agoPHP 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
- rsaarsoo 8y ago- There are high quality packages in every language. - Likewise with mature frameworks. - All mainstream languages have pretty good OOP features nowadays. Thankfully yes, there is no concurrency.
- buboard 8y agowhat has the world come to be, where a series of commands actually running like a series of commands is hailed as an upside.
- ArchTypical 8y agoSame world since Multics.
- lbj 8y agoNo concurrency is a missing feature, not an upside. OOP is a broken paradigme, so no upside to be found there either.
- ArchTypical 8y ago> No concurrency is a missing feature, That's an opinion that isn't very popular or useful. Ignoring the multithreaded PHP runtime and fork functionality, implementing every feature (whatever user X particularly wants) in every language will never happen. Saying OOP is a broken paradigm is irrelevant. Some people prefer it and they are users just like you, but different too.
- invalidusernam3 8y agoSome 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 8y agoThat name is one for errors. I liked it since it was Googleable. Unique names have benefits.
- code_duck 8y agoIf 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.
- alphadevx 8y agoAgreed, here is another one to file under "not a big deal": http://phpsadness.com/sad/46 http://phpsadness.com/sad/46
- perpetualcrayon 8y agoGenerally 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.
- conradfr 8y agoNowadays 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.
- z92 8y agoOne 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 8y agoYou'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.
- dana321 8y agoOne 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.
- skrebbel 8y agoNot 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 8y agoI 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 8y agoYeah 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?"
- solarkraft 8y agoOne might argue that React is clunky (but I completely get the benefits).
- skrebbel 8y agoWhereas PHP is a beacon of elegance? :-)
- 8y ago
- Vanderson 8y agoI 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)
- deleted 8y ago[deleted]
- disgruntledphd2 8y agoWell to be fair, R has always had a good installation story (and CRAN is super-stable), while Python is notorious for issues with packaging (easy_install, pip etc).
- Vanderson 8y agoIt sure does. Which is odd that this alone is a reason I'd use a poorly structured/designed language than a well laid out one. Maybe a similar reason why php also is used over other options? (from a slightly different angle)
- seba_dos1 8y agoAbsolutely. Even the highest ranked comment here now says so.
- code_duck 8y agoIt’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.
- hochchristoph 8y agoTo 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.
- ransom1538 8y agoTo 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."
- buboard 8y agothe inconsistent order of arguments is infuriating, but that has to some extent been inherited from C
- bufferoverflow 8y agoLooks like many of the issues got fixed.
- chx 8y agoYeah, 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 8y agoNot 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
- tormeh 8y agoI 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.
- IgorPartola 8y agoFor 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 8y agoIt 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 8y agoThese 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 8y agoMake 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.
- deleted 8y ago[deleted]