this post was submitted on 16 Jun 2023
74 points (100.0% liked)
Programming
13389 readers
73 users here now
All things programming and coding related. Subcommunity of Technology.
This community's icon was made by Aaron Schneider, under the CC-BY-NC-SA 4.0 license.
founded 2 years ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
Does disappointment count?
After struggling my way through a broken MediaWiki upgrade today, I was reminded once again of just how awful PHP is, both to develop in it and to use applications written in it. What I had to deal with today would not have happened if it were written in a compiled language, because it isn't possible in compiled languages.
Specifically, my MediaWiki settings file contained:
Apparently, this was once required in MediaWiki settings files. After upgrading, though, its presence causes an extremely misleading error message:
My settings file does not contain
$wgBaseDirectory
. Moreover, adding$wgBaseDirectory = MW_INSTALL_PATH;
to my settings file does nothing.Only after a lot of web searching (and a fair amount of profanity) did I finally find out that the above
require_once
statement is the culprit.See the problem here? Interpreted languages like PHP encourage the extremely irritating anti-pattern of using an executable code snippet as a configuration file, which inevitably results in this kind of nonsense. In a compiled language, on the other hand, the easiest way for an application to load settings is by reading them from a data-only format like JSON or TOML, parsers for such formats tend to produce better error messages than this, and the vast majority of such formats don't have an include directive at all.
Had MediaWiki been written in a compiled language instead of PHP, my morning would have been a whole lot less stressful. And this isn't the first time that this configuration-is-code anti-pattern has caused me grief.
Thank you for taking the time to offer a different opinion to the prevailing sentiment. I am certainly in your camp of being wary of interpreted languages.
It's not just that it's interpreted. I code a lot of Python and I've never just read in another Python file as configuration and executed it. Reading a yaml or json file is like 2-3 lines of code. But I'll bet it's not that simple in PHP.
It is that easy in php:
Well in that case, it's just bad coding.
I guess there's a tendency for interpreted languages to attract more bad coders because trial & error is easier and you can get started in fewer steps. Also, fewer confusing compiler errors to deal with.
To be honest, the "configuration is an executed .php file" system does make some amount of sense in the context of PHP. When your app has to re-run everything to serve a web request, having to re-load the config (especially if it's YAML, though JSON is less bad) is expensive. Re-running the PHP code, on the other hand, can be cached way better, in theory.
Of course, this is still all PHP's fault in the end: the core problem here is that you need to re-run everything to serve a web request, without ability to pre-load state like configuration.