13 ms·
My PHP Problems
- deleted 3y ago[deleted]
- zelon88 3y agoI realize it's an opinion blog, but can't help but notice that the author insists on comparing local compiled languages with PHP, a primarily server side interpreted language. Your static compiled binary program will continue working after a system upgrade, but your mish-mash PHP is going to break probably once per year. That said, I'll comment on the code style this author wants to use. It's flashy, confusing, and unnecessary. This person wants to show proficiency with the language by using all its features. That's not how you write good, readable code. Come up with some personal standards for yourself and stick to them. Stop mixing every possible style. You're increasing cognitive load. Continuing on, you want to use all the latest features of the language. That's great, but why are you trying to skin the cat three different ways in the same program? Pick one way and forget the others. If you can't fit all your code into short closures the rest will look like shit and confuse everyone else. I see this all the time with JS guys mixing bracket and dot notation. I feel like there is probably medication that can help with that. Then we get to the fact that you want everything to throw exceptions. Like file_get_contents. No. Just no. You're not supposed to rely on that function to tell you if the file is there. That's what file_exists does. If you've made it to file_get_contents and you don't know if the file is even there, you're doing PHP wrong. You can use that function with a URL and eval to execute remote code. You're not supposed to swing it around like a broken bottle.
- hiAndrewQuinn 3y agoI finally had a chance to write some PHP that (a) wasn't WordPress and (b) actually did something useful a few weeks ago at $DAYJOB. Going from zero to functional web backend in less than 3 hours for a language I'm almost totally unfamiliar with made me understand just why this got so gosh darn popular. I thought building out a Flask application was fast, but PHP's initial experimentation loop is just on another level, criticisms be what they may.
- kingofthehill98 3y agoIt's such a perfect match for the HTTP protocol. You drop a file on a server and you're good to go. My toy VPS is full of useful scripts that I use on a daily basis. Most of them are literally one big file with all of the code, no external dependencies. Caddy proxy the request into PHP-FPM and send back the response, no bullshit. Of course this is not what we see at production-grade software, but I really enjoy the fact that the language was designed with the HTTP protocol in mind. It's really unique in this sense.
- tsukurimashou 3y agoyes, and the fact that you can just put inline HTML outside of PHP tags is so useful and convenient
- zer00eyz 3y agoLOL The fact that I can't tell if this comment is sarcasm or snark or serious says a lot. PHP mixed with HTML was one of the "bad ideas" that hurt PHP. It was a bad practice that got out of hand. Now why no one bats an eye at node/react doing this very thing and calling it JSX is beyond me but...
- mschuster91 3y ago> PHP mixed with HTML was one of the "bad ideas" that hurt PHP. It was a bad practice that got out of hand. So what, JSPs are just the same. In the end what matters is the speed to Get Things Done, and there's utterly nothing competing with PHP, closely followed by Tomcat+JSP as you can use the insane amount of interfaces with just about everything that the Java world has.
- FriedrichN 3y agoWhy is it a "bad idea"? I'm genuinely curious. It works great, it's fast and you don't have to learn a new templating language or dialect every 2-3 years. Or try to figure out how to do trivial things like loops in loops. I don't quite get the use of templating engines in PHP because PHP is a templating engine itself.
- kingofthehill98 3y agoLoved this article, those were all great points that I have faced on my daily job at a PHP shop. A breath of fresh air in amids of thousands of "ew, such a bad language" and "a fractal of bad design", the latter being incredibly outdated and still referenced from time to time. I love PHP, it was my first language and it's one hell of a productive ecosystem to be in. Laravel is an excellent choice for rapid prototyping and Symfony is probably one of the best web frameworks for enterprise projects. Paired with coroutines extensions such as Swoole/OpenSwoole/Swow it puts one hell of a fight performance wise with more modern languages.
- begueradj 3y agoI agree. Also Laravel is one of the best web frameworks for rapid prototyping :)
- bemusedthrow75 3y agoIndeed. Also, I have been looking for GraphQL implementations for other server-side languages recently and I have yet to encounter a schema-first implementation that comes close to what the Lighthouse layer for Laravel can do. That is really productive.
- aglione 3y agohave a look to http://strawberry.rocks http://strawberry.rocks for Python. I've still to find a better code first implementation too
- bemusedthrow75 3y agoThis is one I did look at and then forgot about -- thanks!
- withinboredom 3y agoWhy would you want to use graphql? In my experience, it’s pretty terrible for real-world use-cases.
- esquire_900 3y agoThis is a bit too much of an apples vs oranges. Use cases for PHP (easy to develop, maintain websites) are different from those for Go and Rust. Obviously, PHP came from a place of great inconsistency, and the remains are still there, including the popularity to rant on it. PHP is getting significantly better though, and while a long one, I hugely prefer this route over something more abrupt like python 2-3. The first 3 or so points are valid, but annoyances at best. For the points about closures, statements, inline classes etc., they are just features from other languages that aren't in PHP.
- fHr 3y agoI see the advancements in php and I think I could go back by now but I know that 90% of comapnies recruit you to fix some wordpress 4/php 5 bugy and custom plugin infested site that should just be made from scratch but because there is no money and "just quickly fix it in 1 workday" gives me php ptsd once again.
- hiAndrewQuinn 3y agoPHP is probably like Excel, in that is is really helpful from a raw productivity standpoint to be good at it, but you really don't want other people to know that you're good at it.
- bemusedthrow75 3y agoMmm. It really depends on whether you have the scope to start your projects and stay in control.
- mschuster91 3y agoIME, that also makes PHP worth it for shell scripts. It's miles better than the common baseline that's bash/perl... but once word gets out, people will ask you to rewrite their 30 kLOC sh monstrum into something readable...
- naranha 3y agoidk, when I want productivity I go with nodejs these days. lodash for some quick data crunching and pg or mariadb for db access using promises simply beats native php functions. with express you can spawn a http server in under 10 lines, while with php you need to setup apache/nginx or docker. at some point in the past PHP was the most productive tool for some quick & dirty coding, but not anymore for me.
- withinboredom 3y agoI recommend checking out FrankenPHP, where you can spin up a production php server with a single cli command, or compile your php into a self-executable binary. I’m a contributor over there.
- zer00eyz 3y agoPHP buttered my bread for over a decade. I bear it no ill will, and this article was a lot of nostalgia. The "living on a prayer" comment on serialization brought back memories. It made me acutely aware that I use this pattern in go, and there it "just works". I now have a note to go see what Valinor, PHPStan, Psalm, Serde are because they sound godlike.
- timw4mail 3y agoThe first point is kind of silly: You can make rust-style constructor functions if you want, and have a private constructor to enforce the behavior. Although it does require some boilerplate, which may seem like pointless extra work.
- alfredbez 3y agoI think this was not the point, see: > [...] only to realise there the class has a private constructor or that there are static constructors which I should be using [...]
- bandrami 3y agoI still have contracts in Cold Fusion. PHP is not remotely the worst web templating language out there in active use...
- user3939382 3y agoI respond to every point below. In sum, the native functions should take iterators anywhere it can take arrays. Every other valid criticism he makes and many more I can wrap in the simple statement that: psalm needs to become the runtime type system which is hopefully and appears to be the (maybe distant) future. In the meantime you have 40% and quickly growing of those features in your IDE and 100% in your CI so it’s not a huge deal. Main takeaway for people who haven’t looked at PHP in 10-15 years or since the fractal article and would take the length of this post, which they don’t understand, to say “yep dumb php again” no. ————— Constructors Only had this confusion once with my UUID library and it took me 3 seconds to remember the formula. "In attribute land this becomes:" I've never seen any code or library that uses attributes like this nor do I understand why you would. The only purpose would be static analysis, let's say with psalm, and that's just not how you use attributes in psalm. He says generics are tricky: in psalm they're trivial. The real problem is the best IDEs are still working on getting the integration right. Nested attributes strikes me as an extreme edge case that would only come up in some meta-level tooling you're making for the language which is the provided example. However in this special case presumably this can be accomplished through an extension, xdebug for example does this. Serialization he says is a problem then says, it's a solved problem (there are many such accepted ways to solve this) but then says it still annoys him so not sure? "No Variadic Promoted Properties" I'd like to hear the use case for. I've done very complex things in PHP and never needed this construction. A property can't have a static single type but then also consist of a collection of random types, in this case it would just be an array. It looks like another feature that is solved by psalm. Iterator to Array: Preserve Keys he says he doesn't know if it's wrong. Iterators vs. Arrays this is easily fixed by using the popular Functional library versions of these functions which I agree should be the default. Short closures cannot have statements" I have to convert between them so I kind of get it but would say this is an intentional choice. You can substitute a method call if you really want this. "Statement Blocks in General" That would be nice when and if it's very simple though having them anywhere could turn the language into kind of a mess to read considering what those blocks could contain. Functions that return false - basically everyone agrees on this, it's a conversion that's iterated on with each release and will just take time. The specific example he provides I have wrapped with an exception thrower for just this reason and never use the default. Inline Classes - he says he doesn't know if it's a good idea. I'd say no, having a reliable file system convention between codebases is a plus not a minus.
- sourcecodeplz 3y agoGood for PHP that it's getting more and more traction (attention) lately. Bad press is still press & PHP is quite not bad nowadays, when you start from scratch.
- frank_bb 3y ago[dead]
- reactordev 3y ago“Langauges such as Rust and Go do not have this problem, mainly because they don’t have the new keyword!” Oh but they do. You should spend some time with those languages so you can do a proper comparison. Go has had new for a while now.
- deleted 3y ago[deleted]
- steveklabnik 3y agoGo may (also in my understanding, it's not actually a keyword, but close enough?), but Rust does not.
- reactordev 3y agoOh, excuse me, Box::new :D. At least in rust it’s an explicit method call instead of implicit.
- agumonkey 3y agobut it's a convention right ? there's nothing special about `new` IIRC
- reactordev 3y agoYeah, whether it’s explicit method call or an implicit macro, something is being called. A constructor, a new method, that’s what I was getting at. Saying you dislike the implicit new is valid because you can’t visually see the call where in rust you can. In go, we often take the NewFactory approach even though there’s a new. It’s easier just to return the reference knowing it will out live the stack call.
- steveklabnik 3y agoThat's correct.
- pastureofplenty 3y agoI've been working with PHP for the last couple months or so for the first time in over a decade. I can't say I've enjoyed it. Feels very tedious always having to look up, say, whether the needle comes first or the haystack in a list of arguments. But it runs pretty darn fast, I'll give it that.
- asddubs 3y agoIt's one way for string functions and the other way for array functions. I have a little post-it on my monitor for it.
- djbusby 3y agoMany editors have tools that show language functions and their parameters as you type, so you don't have to subject yourself to that tedium if you don't want.
- calvinmorrison 3y agoOh agree as a daily php writer. The core libs are all over the place for arguments. Doing something that's so elegant in perl results in a mishmash of weird array rules, too helpful built-ins that act weird like isset
- darig 3y ago[dead]
- chuckadams 3y agoFor "functions that return false", use thecodingmachine/safe which wraps those nasty builtins with ones that throw exceptions. PHP's gotten a lot better lately, but it's always going to need library fixes like that for its awful legacy builtins.
- alfredbez 3y agoI like this library and promote that wherever I can, but the safe library was even mentioned in the post: > I love the smell of false in the morning, but despite that I do wish that all PHP’s built-in functions threw exceptions. We have the famous safe library which does just that! But if you’re like me then you don’t like coupling huge amounts of code in perpetuity to an external library.
- chuckadams 3y agoAh, I'd completely missed that. As for depending on an external library ... get used to it. Writing PHP without any external deps is strictly for one-off scripts -- and rarely even then.
- user3939382 3y agoI just wrap the ones I actually need that for and put them in traits (sometimes multiple related per trait). So it's internal, small footprint, and really needs 0 maintenance. This is also good for e.g. json_* when you want to provide app-wide defaults.
- s1k3s 3y ago> This is a subjective post about things that annoy me, some of the points are invalid and for sure people with far more context and brain power than I have have considered them. It is also to be expected that I take for granted things that would annoy other people. Great disclaimer, since most of the points raised in this article seem very nitpicky to me. This is understandable considering that OP's PHP work is about creating a language server and some benchmarking tool, both of which are definitely not the main use-case for this language. I bet your average PHP dev has no idea about the things mentioned in this article, nor are they interested in improving them.
- alfredbez 3y agoI work on the same team as the author. I appreciate PHP in general, particularly because it contributes significantly to covering expenses (earning a six-figure income in Europe). While there is undoubtedly room for improvement in the language, this post highlights some valid points that we encounter in our day-to-day work on the 'large E-Commerce project' briefly mentioned at the beginning. I hope that discussions like these raise awareness within the PHP community and eventually lead to solutions. Considering the impressive initiatives the PHP foundation has recently undertaken, I am confident that the language is evolving in the right direction. Certainly, there are still individuals in the PHP world who may not grasp the essence of this post. In some tech interviews, I've encountered people stating that they 'don't know PHP, only Laravel.' I don't oppose Laravel (or WordPress or any other framework); I just want to emphasize that some individuals may not appreciate the underlying technology. Reflecting on my early days of programming, there was a tendency to exclusively focus on learning jQuery, neglecting the importance of understanding JavaScript.
- endofreach 3y agoI might be a minority, but i truly enjoy PHPs syntax a lot. No other language i use gives me the same joy. Modern PHP is great, the past & some fundamental decisions are automatic tech debt that i can live with. It'd be great if PHP 8.3 gets forked with no backward compatibility, removing all the old PHP as a template engine designed functions that nobody needs & release under a new name. I just can't find the same type of joy in writing code as i do when writing PHP. But some things are truly annoying. Just not enough for me to switch or start the fork myself.
- chuckadams 3y agoOn a few occasions I've done a few weeks of refactoring the php source toward creating just such a fork, but decided it was just going to be too much work over time for too little benefit for too few people. And that's true of pretty much all "legacy-free" forks: it's fun to rip out all the legacy crap, but you're left with an incompatible language in the end, at which point you're probably better off starting with a different language entirely.
- endofreach 3y agoAnything of your refactorings public to check out? > but you're left with an incompatible language in the end, at which point you're probably better off starting with a different language entirely. Yes, but which one? No matter which one i try, in the end, i am always close to rewriting it with php. Eg as many good things go has, i don't enjoy the syntax as much as phps. I could live with it, given the advantages. But i can't get over it, that most of my code seems to be error checking. Sure, that's probably a good thing for serious work. But that's just not where the joy in programming lies for me. Most cases phps try-catch feels much, much more elegant / fun to write (not comparing the efficiency of the outcome). I do love the fact i end up with a single executable. And php without framework requires much more overhead, which is also annoying. And i am done with php frameworks.
- chuckadams 3y agoI'm afraid I burned it down to the ground, but the last attempt never got me much past reorganizing the headers and ripping out ifdefs for all non-posix systems (bye bye windows support). These days I'm interested in more green-field languages like unison, though I'm still trying to think of something to write in it (or any inspiring language, really).
- syspec 3y agoThe beauty of PHP is that you're always seeing $$$ signs
- atum47 3y agoI just launched an app that I've been using with my friends to collect and share memes. PHP on the backend and vanilla JS on the front end. Made a PWA out of the thing with some manifest and now I have something that I'm really proud of, that was put together in one week. If I see a funny meme I can just share it with my PWA and it will post it for me.
- nikeee 3y agoI'd love PHP to have proper primitives for working with binary data / buffers. You still have to use strings for that. Those strings are immutable, so performance will suffer. In JS, there are pretty decent APIs for that. Just copy them, they work good. There is an extension, but you have to build it from source and doesn't cover all of it. Same goes for container data types. All you've got is array. No sets, no hashmaps, ordered sets, sorted sets. Array is just all of this at the same time. There's also an extension for that, but its API is... not optimal. I wonder how much faster some programs could be if the array wasn't used as the universal data type. If one could use composer to install PHP extensions, that would be awesome. I fiddled around with WASM as a language for universal PHP extensions that can be loaded via composer, but there does not seem to be a lot yet.