Raise E_NOTICE for null castings

php.internals

Filippo Tessarotto

8 years ago
Hi, I would like to propose an RFC to raise an E_NOTICE when a variable "initialized" to null is casted to other types: $foo = null; var_dump($foo['bar']); var_dump($foo . 'bar'); var_dump($foo + 2); var_dump($foo & 2); // At the time being, this code produces no errors The eventual vote may be split one for each case. What do you think? Best regards, Filippo

lists@rhsoft.net

8 years ago
Am 27.10.2017 um 11:49 schrieb Filippo Tessarotto:
> Hi, I would like to propose an RFC to raise an E_NOTICE when a variable > "initialized" to null is casted to other types: > > $foo = null; > var_dump($foo['bar']); > var_dump($foo . 'bar'); > var_dump($foo + 2); > var_dump($foo & 2); > // At the time being, this code produces no errors > > The eventual vote may be split one for each case. > > What do you think?
pleae don't break code like this which is a useful case for access directly a array field returned from a function and so makes this to a one-liner without check the result public function GetMaxSort(): int { return (int)mysqli_fetch_row($this->cl_api->db->query("select SQL_NO_CACHE max(hsort) from {$this->cl_api->sql_prefix}main", 1))[0]; }

Niklas Keller

8 years ago
> > Hi, I would like to propose an RFC to raise an E_NOTICE when a variable >> "initialized" to null is casted to other types: >> >> $foo = null; >> var_dump($foo['bar']); >> var_dump($foo . 'bar'); >> var_dump($foo + 2); >> var_dump($foo & 2); >> // At the time being, this code produces no errors >> >> The eventual vote may be split one for each case. >> >> What do you think? >> > > pleae don't break code like this which is a useful case for access > directly a array field returned from a function and so makes this to a > one-liner without check the result > > public function GetMaxSort(): int > { > return (int)mysqli_fetch_row($this->cl_api->db->query("select > SQL_NO_CACHE max(hsort) from {$this->cl_api->sql_prefix}main", 1))[0]; > > } >
Just use return (int) mysqli_fetch_row($this->cl_api->db->query("select SQL_NO_CACHE max(hsort) from {$this->cl_api->sql_prefix}main", 1))[0] ?? 0; Regards, Niklas

lists@rhsoft.net

8 years ago
Am 27.10.2017 um 12:54 schrieb Niklas Keller:
> pleae don't break code like this which is a useful case for access > directly a array field returned from a function and so makes this to > a one-liner without check the result > > public function GetMaxSort(): int > { >  return (int)mysqli_fetch_row($this->cl_api->db->query("select > SQL_NO_CACHE max(hsort) from {$this->cl_api->sql_prefix}main", 1))[0]; > > } > > > Just use return (int) mysqli_fetch_row($this->cl_api->db->query("select > SQL_NO_CACHE max(hsort) from {$this->cl_api->sql_prefix}main", 1))[0] ?? 0;
thanks - that's indeed the better solution and since i use MYSQLI_OPT_INT_AND_FLOAT_NATIVE in the database layer the complete type-casting can be removed too!

Christoph Becker

8 years ago
On 27.10.2017 at 11:49, Filippo Tessarotto wrote:
> Hi, I would like to propose an RFC to raise an E_NOTICE when a variable > "initialized" to null is casted to other types: > > $foo = null; > var_dump($foo['bar']); > var_dump($foo . 'bar'); > var_dump($foo + 2); > var_dump($foo & 2); > // At the time being, this code produces no errors > > The eventual vote may be split one for each case. > > What do you think?
Note that there is already an accepted RFC regarding rasing E_WARNING for invalid container read array-access[1]. However, it has not been implemented yet, due to difficulties, see the discussion on PR #2031[2]. [1] <https://wiki.php.net/rfc/notice-for-non-valid-array-container> [2] <https://github.com/php/php-src/pull/2031>
-- Christoph M. Becker

Filippo Tessarotto

8 years ago
I am sorry for partial topic duplication regarding array-access. Still, at least with `declare(strict_types=1);` auto-castings of non-numbers should raise an error: var_dump(false + 2); var_dump(null + 2); Exactly like `"" + 2`. WDYT? Filippo Il 27/10/2017 13:47, Christoph M. Becker ha scritto: