https://wiki.php.net/rfc/objects-can-be-falsifiable 
<https://wiki.php.net/rfc/objects-can-be-falsifiable>

Updates:

- Open issues (outstanding questions/concerns) updated
- Future scope
- References now have links to original copies on GitHub (still updating 0002) 
- will be removed if accepted and implemented.
- No violent opposition, but concerns - will be looking at how to implement (or 
set up implementing).

All:

Trying to let conversation flow w/o me; sticking to once a day batch updates. 
Let me know if you’d prefer something else - still learning the Roman-way. :)

To Larry’s user example. 

With Falsifiable the User instance becomes more self-aware. __toBool(), which 
might be more for the object itself, other objects, or PHP itself through a 
universal, reserved API entry point (like other magic methods).

Trying to make PHP fail gracefully more by adding to the ability of not 
returning null (or interacting with null - nullsafe, optionals, and so on).

(Maybe that should be a table as well??)

print null; // always succeeds despite being nothing - not a fatal error

(bool) null; // always succeeds - always false

(integer|float) null; // always succeeds - always 0

(array) null; // always succeeds - always []

(string) null; // always succeeds - always “"

null->someMethod(); // always fails - crashes app

I was in the conversations leading up to null being able to handle this much 
interaction, part makes me go back to something talked about re new developers 
(paraphrased): It's frustrating to learn software development when it takes a 
lot to set up and with every turn you take your app crashes - people give up; 
so, PHP prefers failing gracefully over hard crashes. 

The only interaction on null that seems to fail outright (from personal 
experience) is trying to call a method because it’s not an object. (It doesn’t 
even fail the dread array-to-string conversion. lol)

> I really appreciate any effort that can make PHP a more powerful language. 
> However, for this item, I believe it will generate much greater cognitive 
> complexity for new users (and I hate to assume that this is a problem, but we 
> have to remember our roots).

David: Completely agree on respecting new users and devs (see opening bit).

I’m thinking right now, for me, it’s more about always being able to message 
the type you expect, even if false (in the abstract), while also letting PHP to 
interact automatically with it in the ways we have also become accustomed. 

> (bool) cast working together with __toBool() is a good one, but I think that 
> it is being discussed in another topic.

Was it an RFC or email?? 

If email and within the last week or so, it might be this same conversation. 

Took a moment to evolve to this kinda hybrid approach. (In short, back to the 
original implementation, with a pretty different rationale.)

> The other implication is that this is now possibly *not* a bug:
> 
> if (!$foo) {
>  $foo->bar();
> }

Matthew: I can see that feeling like a bug, for me it would be a feature (can’t 
believe I just said that). 

Objects that return an abstracted (high-level) false, can tell me why (without 
blowing things up via fatal errors or added syntax and time of try-catch-throw 
or various permutations of optionals, which is possibly frustrating for new 
devs - possibly specific to the self-taught, it was for me back in the day - 
still don’t have the muscle memory for try-catch-throw and implementing errors).

I can’t ask null any questions - it exists only in the mind (so to speak), but 
I can send messages to an instance that is abstractly false. (And remove all 
the null-checks and optionals from (at least) my code that uses it or wraps 
some package that doesn’t.

My contract with a function call becomes: You will always get something of this 
type - period. Whether it’s the one you specifically wanted, that would be 
debatable, but it will be that type.

> "Further, the union type bool|Falsifiable will be dynamically added at run 
> time to any object implementing the reserved __toBool() method, which would 
> allow stdClass() objects to be defined as Falsifiable also. "
> 
> What's that about?

Larry: Totally lifted from the Stringable RFC - lol: 
https://wiki.php.net/rfc/stringable <https://wiki.php.net/rfc/stringable> - 
string|Stringable

And I don’t know of a way to add an interface to `new stdClass()` - but thought 
this might be a valid use case:

$object = new \stdClass();
$object->__toBool = function() { 
  return false|true; 
};

if (! $object) {
  // made it
}

> "(Including __construct() replacing old style constructors in PHP 7.)" - 
> __construct replaced old-style constructors in PHP 5. :-)

Here’s where I got that from: 
https://www.php.net/manual/en/migration70.deprecated.php 
<https://www.php.net/manual/en/migration70.deprecated.php>

Might have been tired when reading it. Are old style constructors still 
available at all in PHP 7 (just deprecated)?? Looking for when old constructors 
were removed - not just deprecated.

> I think the truth tables have a formatting error; check the last line that 
> goes wider than the rest.  Also, watch out for "smart quotes" in the string 
> parts.  Also, YAY summary tables!

Thanks for the table suggestion! 

Not sure I’m getting the same issue. If you mean the line that starts with “row 
1” - this is a different paragraph, not part of the table - its width is styled 
wider than the table. Margin-bottom is 1.5rem on paragraph - 0 on the table; 
so, they butt against one another.

Is there a way to add an empty line (don’t recall seeing it in the wiki 
syntax)?? Or, are you noticing something else??

> Let's not confuse Java nullable issues with PHP nullability, which is quite
> healthy :-)


Marco: To be fair, I don’t know anything about Java’s nullable issues - only 
PHP's. :)

> BTW, I'm not saying you should pursue both RFCs or anything, that's
> just a reference in case you are looking around how others did it. 

Marcio: Thanks for the example! I’ve never used a language that has this as a 
possibility by this type of implementation - Swift is capable by way of 
overloading operators (at least last I used it). Definitely would like more 
examples of languages that do something like this. (Links to those 
conversations to glean high-level concerns and possible problems might be 
helpful as well.)

Definitely not looking to pursue both at this time as emptiness or nonzero is 
harder for me to justify to myself, much less the larger community - not that 
it shouldn’t happen.

Cheers,
Johs

Reply via email to