Thus, can you provide any other dangerous example? On Wed, Nov 4, 2020, 6:59 AM Eugene Sidelnyk <zsidel...@gmail.com> wrote:
> But wait! > > In your example, funds won't get detracted. If `$accounts->get($receiver)` > will return `null`, then everything inside `addFunds(...)` will not be > executed. > Your example (simplified): https://3v4l.org/38Dk3 > > Another one: > ```php > function expensive_function() { > var_dump(__FUNCTION__); > } > > $foo = null; > > $foo?->baz(expensive_function()); > ``` > > On Tue, Nov 3, 2020 at 10:11 PM Marco Pivetta <ocram...@gmail.com> wrote: > >> Heya, >> >> On Tue, Nov 3, 2020, 17:38 Eugene Sidelnyk <zsidel...@gmail.com> wrote: >> >>> Hello, internals! >>> I am wondering why don't we use ordinary `->` operator with safe null >>> handling? Programmers will be more prone to return null values. And thus, >>> in most of cases `?->` will replace `->`. >>> Why do we need another operator, if we can implement null safe in current >>> operator without BC breaks? >>> >> >> Overall, "null safe" can be very dangerous if made the default. >> >> Here's a scenario where I'd never want "null safe" behaviour (which does >> anything but introducing safety): >> >> ```php >> $accounts->get($receiver) >> ->addFunds( >> $accounts->get($sender) >> ->detractFunds($amount) >> ); >> ``` >> >> In the above scenario, if the first `$accounts->get()` call returns >> `null` for any reason, you may actually destroy money (funds detracted, but >> never added to another account). >> >> The example is simplistic, but it shows that "null safe" is everything >> but "safe", and it must instead be used only where it absolutely makes >> sense to suppress null reference errors. >> >> Similar behaviour can be observed around cast operators, which are too >> lax for most businesses logic: >> https://github.com/ShittySoft/symfony-live-berlin-2018-doctrine-tutorial/pull/3#issuecomment-460441229 >> >> Safe = crashes when it should crash. >> >>>