---- En vie, 08 may 2020 23:40:22 +0200 Bob Weinand <bobw...@hotmail.com> 
escribió ----
 > > Am 04.05.2020 um 10:53 schrieb Manuel Canga <p...@manuelcanga.dev>:
 > > 
 > > Hi internals,
 > > 
 > > 
 > > 
 > > I would like to present a possible new RFC( "keep type of reference 
 > > params" ) for your
 > > 
 > > consideration.
 > > 
 > > 
 > > 
 > > Firstly, an example:
 > > 
 > > 
 > > 
 > > ```
 > > 
 > > <?php
 > > 
 > > 
 > > 
 > > function my_array_shift( array & $array ) {
 > > 
 > >     $array = "string";
 > > 
 > > }
 > > 
 > > 
 > > 
 > > $array = [ 0, 1, 2, 3, 4 ];
 > > 
 > > 
 > > 
 > > my_array_shift($array);
 > > 
 > > 
 > > 
 > > count( $array );
 > > 
 > > ```
 > > 
 > > 
 > > 
 > > The result of this code is a warning( in count line ) because of $array is 
 > > a string. 
 > > 
 > > However, I think it should be an error or exception when a string is 
 > > assigned to $array var. 
 > > 
 > > In my opinion, $array var would have to keep its type when function ends.
 > > 
 > > 
 > > 
 > > What is your opinion ? Do you see it useful ?
 > > 
 > > Thanks and I'm sorry for my English( I'm a Spanish ).
 > > 
 > > Regards
 > > 
 > > --
 > > 
 > > Manuel Canga
 > 
 > Hey Manuel,
 > 
 > the primary issue (apart from the BC break) here is leaking the reference 
 > across the function boundary.
 > 
 > function a(array &$a) {
 >     $GLOBALS["globalA"] = &$a;
 > }
 > 
 > funcition b() {
 >     $GLOBALS["globalA"] = 10;
 > }
 > 
 > $a = 1;
 > a($a);
 > b();
 > // $a is magically changed to 10
 > 
 > Yes, you can here verify, that $a is an array at the function boundaries, 
 > but you cannot afterwards.
 > 
 > If we had proper inout parameters (which do not leak a reference, but assign 
 > the value of the variable (in callee scope) back to the passed variable from 
 > caller), then we could easily enforce it.
 > 
 > But as it stands now, this is not an option. (Especially due to the false 
 > promise this seems to make.)
 > 
 > Bob

Thanks Bob, that was a great example

I explain...I am very forgetful, so it's very easy  for me to write somethink 
like this:

```
function filter_something( &string $to_filter) {
  $to_filter  = strtolower($to_lower);
  $to_filter  = sanitize_this($to_filter);
  .....
} 

filter_something($my_string);
```

Sometimes, one of these functions can returns a false|null|numeric|... instead 
of expected type. 
Also, If any function in 'filter_somethid' would throw an exception, value in 
$to_filter would finish inconsistent

However, with:

```
function filter_something( inout string $to_filter) {
  $to_filter  = strtolower($to_lower);
  $to_filter  = sanitize_this($to_filter);
  .....
} 

filter_something(inout $my_string);
```

PHP could in the end produce exception when any function in `filter_something` 
modify type of $my_string or  
PHP could keep value of `$to_filter` as well if any function  throwed an 
exception.

Regards
--
Manuel Canga

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to