View Issue Details

IDProjectCategoryView StatusLast Update
0005594Composrcorepublic2024-11-28 15:01
ReporterPatrick SchmalstigAssigned ToPatrick Schmalstig 
SeverityFeature-request 
Status resolvedResolutionfixed 
Product Version 
Fixed in Version 
Summary0005594: Consider declare(strict_types=1) in codebase (rolling)
DescriptionSince it is not possible at this time to maintain the special ocp PHP (much less compile it on certain machines), we should consider adding declare(strict_types=1) at the top of every PHP file in the v11 codebase.

Be cautious about its implementation; it must also be explicitly included in eval code (unless we're pulling code from a file that already has it declared).
TagsRoadmap: Over the horizon, Roadmap: v11 partial implementation, Type: Standards compliance
Time estimation (hours)
Sponsorship open

Relationships

related to 0005473 resolvedPatrick Schmalstig v12: Consider *_compiled directories 

Activities

Patrick Schmalstig

2024-02-07 01:56

administrator   ~0008292

Last edited: 2024-02-07 01:57

View 2 revisions

Bumped to v12 / rolling issue. This will require a major refactoring of the code because of instances like this one for example:

if (@strlen(cms_file_get_contents_safe($_SERVER['SCRIPT_NAME'], FILE_READ_LOCK)) > 4500) {

Even though strlen is suppressed, this still throws a TypeError when cms_file_get_contents_safe evaluates to false. Type checking must happen before the strlen call. There are many cases of things like this throughout the code.

So a better approach is to implement this gradually.

Chris Graham

2024-02-10 19:53

administrator   ~0008309

I'm not sure this is a good idea. One of the goals with v11 was to make production deployments less fragile. We have the new config options for toning down the handling of PHP Notices, Warnings, etc. I don't know if strict_types would be going against this - or would we also still be able to filter them out based on configuration just like we do PHP Notices? I thought type errors were fatals when this was on. The fact @ doesn't stop it suggests it is fatal.

If we can no longer maintain/deploy ocProducts PHP, I think it makes more sense to reassess what we were trying to achieve with it and how important that is given new realities.

Patrick Schmalstig

2024-02-10 20:21

administrator   ~0008314

Yeah I have been giving this thought as well. That's one of the reasons I quickly decided against considering it for v11 at least.

You are right. TypeErrors are fatal. They can, however, be handled, at least I assume they can because Composr's critical error handling handled them when I gave it a try.

PHP's implementation of strict_types is not very intuitive. It's runtime-level. It has to be defined on every file you want it to run. It must also be defined in eval code if you want eval code to be strict type checked. It must be defined top-level. You can't dynamically turn it off/on. Etc. This means we can't simply implement it just for DEV_MODE.

"If we can no longer maintain/deploy ocProducts PHP, I think it makes more sense to reassess what we were trying to achieve with it and how important that is given new realities."

I still think XSS checking and type strict checking is very important and should still be strong considerations. XSS attacks are on the rise, I believe, in general (especially with WordPress). But you're right. We can't maintain / deploy it anymore.

Chris Graham

2024-02-10 20:44

administrator   ~0008319

ocProducts PHP predates PHP itself supporting strict typing, and I retroactively added forcing the strict_types option on as an addon to what I had previously done.
The PHP community had an extremely rough time agreeing on strict typing. The Zend developers, who were stewarding the project at the time, were vehemently against it at all. I would have preferred an ini setting, but the issue there is that it forces all third party code to support strict types too - which many PHP core devs could never get behind as it was such a fundamental changing in the expectations for PHP developers and compatiblity.

The XSS issue is almost entirely mitigated by CSP, which did not exist when I implemented the XSS functionality for ocProducts PHP.

Patrick Schmalstig

2024-02-11 04:34

administrator   ~0008333

Last edited: 2024-02-11 04:35

View 2 revisions

I agree. I'm closing this issue under the following premise:

Strict type checking should mainly be done at the development / IDE level, not runtime, as runtime checks make for very fragile code (since Type Errors are fatal).

We have CQC which helps with this. And some IDEs can check for it as well, although ultimately only CQC is able to type-check Composr types. I think that's good enough though couple with PHP's type support as of 7 and 8.

Chris Graham

2024-07-25 19:28

administrator   ~0008944

I'm reopening this, because in dev-mode we could inject it when code files are loaded via sources/global.php.

Chris Graham

2024-07-25 19:31

administrator   ~0008945

What to do about ocProducts PHP is a deeper question worth considering. It makes PHP stricter than any other PHP tool out there can do, and we have coded to that level of strictness. One advantage to that is it will make Composr more easily portable to a language other-than-PHP if we so wish, e.g. Go or Rust.
I think for now it would be fine to not force Composr devs to run ocProducts PHP, would be good to add publicly-supported strictness in dynamically, but also not erase the possibility of using ocProducts PHP as a bridge out of PHP in the future if we consider it appropriate.

Patrick Schmalstig

2024-11-24 22:22

administrator   ~0009681

I started working on this.

I modified the Composr system to use bootstrap.php instead of global.php as the initial entry point. bootstrap.php contains the bare minimal code necessary to load up global.php or minikernel.php with strict_types if in DEV_MODE. All entry-point scripts have been modified to use bootstrap.php instead of global.php and then call up global from there.

This ensures we can get strict type checks on global / minikernel as well.

So far so good; the code is working as expected, and I'm getting a lot of strict type errors that need fixed (e.g. passing in false when we shouldn't, floats where ints should go, and so on).

This issue will take a while to complete as I essentially need to spider through the sitemap to find any type errors we missed all these months not using ocp PHP. But that's fine; the good news is we have strict type checking again despite not having ocp PHP.

Patrick Schmalstig

2024-11-28 15:01

administrator   ~0009688

Marking resolved. I implemented it.

There may still be some bugs because essentially, I had to also incorporate what was once planned for v12 (0005473) in this issue (otherwise stack traces in dev mode are completely borked). I will also be making a post there because I decided not to implement it as the original issue indicated.

Issue History

Date Modified Username Field Change
2024-02-07 01:28 Patrick Schmalstig New Issue
2024-02-07 01:28 Patrick Schmalstig Status non-assigned => assigned
2024-02-07 01:28 Patrick Schmalstig Assigned To => Patrick Schmalstig
2024-02-07 01:28 Patrick Schmalstig Tag Attached: Roadmap: v11
2024-02-07 01:54 Patrick Schmalstig Tag Detached: Roadmap: v11
2024-02-07 01:55 Patrick Schmalstig Tag Attached: Roadmap: v12
2024-02-07 01:56 Patrick Schmalstig Note Added: 0008292
2024-02-07 01:56 Patrick Schmalstig Tag Attached: Roadmap: v11 partial implementation
2024-02-07 01:57 Patrick Schmalstig Note Edited: 0008292 View Revisions
2024-02-07 01:57 Patrick Schmalstig Summary Consider declare(strict_types=1) in codebase => Consider declare(strict_types=1) in codebase (rolling)
2024-02-10 19:53 Chris Graham Note Added: 0008309
2024-02-10 20:21 Patrick Schmalstig Note Added: 0008314
2024-02-10 20:44 Chris Graham Note Added: 0008319
2024-02-11 04:34 Patrick Schmalstig Status assigned => closed
2024-02-11 04:34 Patrick Schmalstig Resolution open => won't fix
2024-02-11 04:34 Patrick Schmalstig Note Added: 0008333
2024-02-11 04:35 Patrick Schmalstig Note Edited: 0008333 View Revisions
2024-03-26 00:58 Patrick Schmalstig Tag Renamed Roadmap: v12 => Roadmap: Over the horizon
2024-07-25 19:27 Chris Graham Status closed => non-assigned
2024-07-25 19:27 Chris Graham Resolution won't fix => reopened
2024-07-25 19:28 Chris Graham Note Added: 0008944
2024-07-25 19:31 Chris Graham Note Added: 0008945
2024-07-25 19:31 Chris Graham Category General / Uncategorised => core
2024-07-25 19:32 Chris Graham Tag Attached: Type: Standards compliance
2024-11-24 22:22 Patrick Schmalstig Note Added: 0009681
2024-11-28 15:01 Patrick Schmalstig Status non-assigned => resolved
2024-11-28 15:01 Patrick Schmalstig Resolution reopened => fixed
2024-11-28 15:01 Patrick Schmalstig Note Added: 0009688
2024-11-28 15:01 Patrick Schmalstig Relationship added related to 0005473