Bug #75445 [Com]: User-defined assert function is optimized away with zend.assertions=-1
Edit report at https://bugs.php.net/bug.php?id=75445&edit=1
ID: 75445
Comment by: kelunik@php.net
Reported by: kelunik@php.net
Summary: User-defined assert function is optimized away with
zend.assertions=-1
Status: Not a bug
Type: Bug
Package: Scripting Engine problem
Operating System: Irrelevant
PHP Version: 7.2.0RC5
Block user comment: N
Private report: N
New Comment:
Correct, it has been added to https://wiki.php.net/rfc/deprecations_php_7_3
and it will hopefully be accepted to be deprecated in PHP 7.3 and forbidden in PHP 8.
Previous Comments:
------------------------------------------------------------------------
[2017-12-20 14:10:39] nikic@php.net
IIRC when we discussed this with @kelunik last time, throwing a fatal error if you try to define an
assert() function seemed like the best way to resolve this. assert() is essentially a
language-construct now, we should treat it as such.
------------------------------------------------------------------------
[2017-12-20 13:17:27] mikko dot rantalainen at peda dot net
The fact that namespaces are honored for assert() BUT the same optimization still happens (the call
to assert() is blindly removed) should be explained on page http://php.net/manual/en/function.assert.php
You cannot expect developers to read old RFC documents to find this out.
------------------------------------------------------------------------
[2017-10-27 09:57:08] nikic@php.net
By design, for the reason you already mentioned. It's also defined in the RFC, see https://wiki.php.net/rfc/expectations#namespaced_assert.
------------------------------------------------------------------------
[2017-10-27 08:48:37] kelunik@php.net
Description:
------------
Execute the test script:
- php -d zend.assertions=1 test.php
- php -d zend.assertions=0 test.php
- php -d zend.assertions=-1 test.php
assert() doesn't respect the namespace fallback, but assumes unqualified calls are
equivalent to \assert() and optimize it away / jump around it with assertions disabled.
This is unfortunate, as few people use \assert() over assert() and
wouldn't gain zero-cost assertions without this behavior.
Test script:
---------------
<?php
namespace Test {
function assert() {
global $foo;
$foo = true;
}
}
namespace Test {
assert();
var_dump(isset($foo));
}
Expected result:
----------------
bool(true)
Actual result:
--------------
bool(false)
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=75445&edit=1
Thread (5 messages)