Because PHP packages are vendored by default, so there's an implicit stopgap on the propagation of issues from upstream.
Because PHP isn't dependent on a single vendor with a single global namespace, which avoids several of the issues you mentioned.
You can basically repeat that for other languages whose ecosystems benefit from the wisdom of years accumulated around package management and library design that Node seems to ignore.
edit: and the more I think about it, I suspect a lot of the bad practices in the modern JS ecosystem are due to the paradigm of having the same language running in the browser and on the server. This creates conflicting incentives in the way things are designed and deployed and one necessarily undermines the other.
Most software developers do not sign their git commits. And if they do, they probably aren't doing it properly (store keys on a YubiKey or only use QubesOS with an isolated dev qube and split GPG).
If you do any sort of dev work, you really need to isolate that activity from the other things you do online and generate a signing only GPG subkey and handle it properly and sign all of your git commits. I think this is vital to ensuring code integrity as if you do not do this, you probably won't even realize when someone has tampered with your code.
Hope this helps.
See feross's reply for a better explanation: https://news.ycombinator.com/item?id=30964442
Things like vendoring, upstream version metadata to reduce redundant network requests, SHA verification, are all easy to add after the fact. Support for arbitrary dependencies on the other hand often require a certain amount of support on the compiler level (to detect conflicting exported data structures) which is why many languages cannot easily switch to newer package management architectures.
If you are going to target something, you pick what you think is going to get the most effect, thus you pick the in-group, not the out-group.
PHP is in-group in one area and that is Wordpress, and of course it also constantly targeted.