On 19 February 2026 20:24:56 GMT, Mirco Babin <[email protected]> wrote:
>> That's a different kind of "why". I meant, "why would a programmer
>> deliberately call a function __construct, and have no intention of
>> *ever* using it as a constructor".
>
>A theoretical example can be found in
>"Unaffected calling the parent constructor example".
>UnaffectedBaseClass could be abstract.
>
>```php
>class UnaffectedBaseClass
>{
>    public function __construct()
>    {
>        return ['important'];
>    }
>}
>
>class UnaffectedCallParentConstructor extends UnaffectedBaseClass
>{
>    public function __construct()
>    {
>        $important = parent::__construct();
>    }
>}
>
>$it = new UnaffectedCallParentConstructor();
>```


In that example, the method on UnaffectedBaseClass can not be used as a 
constructor under your proposal. As such, it's just a normal method which can 
be trivially renamed: 

```
class UnaffectedBaseClass
{
    public function initialise()
    {
        return ['important'];
    }
}

class UnaffectedCallParentConstructor extends UnaffectedBaseClass
{
    public function __construct()
    {
        $important = parent::initialise();
    }
}

$it = new UnaffectedCallParentConstructor();
```



>> If they are using it as *both* a constructor and a normal method,
>> *their code will break with your proposal* because at some point
>> they will call it as a constructor and hit the new error.
>
>Not necessarily. When an if is used, __construct() can be either.


True. I'm not convinced the language should bend over backwards to support such 
a pattern, though.



>The Php scripting aspect makes it difficult in general
>for untyped projects to fail early. 


This is a completely irrelevant statement. We're not talking about failing 
early "in general", we're talking about a compile-time check that PHP already 
makes in other contexts.



>> The only difference that delaying the error to run-time makes, is that
>> it will take longer for people to notice that it is broken.
>
>Not necessarily true. Assume the code is running fine on a shared hosting
>platform with Php 8.5. Then the hosting provider decides to force an
>update to Php 9, because of a critical vulnerability. That same code
>would then break at some point. 


I don't see how this contradicts what I said. Instead of it failing 
immediately, it fails "at some point" - so, it will take longer to happen. You 
consider that a good thing, I consider it a bad thing; I guess we're not going 
to convince each other on that.


>I assume the spaghetti contains some version of my two theoretical
>examples.
>
>So it is safer to *not* make the return type declaration implicitly "void".


The way I see it, we have to draw the line somewhere regarding what use of 
"__construct" methods is "acceptable", and what use we're going to force users 
to fix. There are three options on the table: 

1) You may return any value, the "new" operator will silently discard it 
[current behaviour]
2) You must not return a value
3) You may return a value in the definition, but must make sure that no uses of 
the "new" operator reach that return statement


I find option 3 unnecessarily complicated. Faced with an existing code base, 
checking and fixing violations of option 2 seems a lot easier than keeping the 
return values but making sure they won't error under option 3.

I think that either we should add a simple, easily checked, rule - option 2; or 
we should avoid breaking people's code, and retain option 1.


Regards,

Rowan Tommins
[IMSoP]

Reply via email to