Vraag Nieuw door verwijzing die geen waarschuwing geeft


Over het hele internet[1][2][3], het zegt dat sinds PHP 5.0.0 "toewijzen van de geretourneerde waarde van nieuw door verwijzing" een geeft E_DEPRECATED of E_STRICT afhankelijk van je php-versie (E_DEPRECATED bestond niet tot 5.3, zo was het E_STRICT daarvoor).

Als zodanig is het mijn begrip dat deze code een dergelijke waarschuwing zou moeten geven:

error_reporting(E_ALL | E_STRICT);

class A
{
}

$a =& new A();

Ik heb dit echter geprobeerd op twee totaal verschillende servers (één met PHP 5.3 en één met PHP 5.2) en geen van beide geeft een bericht! Wat gebeurd er? Is mijn begrip onjuist of is er iets vreemds aan de hand op deze twee servers?

(Ik vind het ook vreemd dat dit verouderd is, gezien dat $a = null; $b =& $a; $b = new A(); doet niet hetzelfde als $a = null; $b =& $a; $b =& new A();, maar dat is slechts een deel van de vraag of ik verkeerd heb begrepen wat is verouderd ...)


11
2017-11-06 14:24


oorsprong


antwoorden:


In reactie op het OP wees deze opmerking hem in de goede richting:

Het zou me niet verbazen als het probleem hier ergens anders ligt: ​​probeer E_ALL | E_STRICT in je php.ini direct, vergeet ook niet om de php-cli.ini te veranderen als je deze code op de commandoregel gebruikt.
Controleer ook of de fouten niet verborgen zijn door een ini_set('display_errors',1);1. Als je dit op een Windows-venster gebruikt, zijn dat er geweest sommige bugs hiermee in het verleden.

Omdat het OP ook opmerkte dat de waarschuwingen werden gegenereerd voordat een code werd uitgevoerd, had ik een vermoeden dat de verwachte waarschuwingen tijdens de compileertijd en niet in de runtime zouden worden verhoogd, dus ik keek nog een keer naar de documenten. Daar vond ik deze grote rode doos, die mijn vermoeden bevestigde:

De meeste E_STRICT-fouten worden geëvalueerd op de compileertijd, dus dergelijke fouten worden niet gerapporteerd in het bestand waarin error_reporting is verbeterd om E_STRICT-fouten (en omgekeerd) te bevatten.

Sinds versie 5 is PHP effectief een "gecompileerd" taal (vergelijkbaar met Java, de code is gecompileerd naar Zend Bytecode). Wanneer de Zend-engine code compileert met fouten die op het gecompileerde tijdstip zijn uitgegeven, een in-script error_reporting oproep heeft geen effect op het weer of niet deze fouten worden gerapporteerd: de error_reporting oproep is alleen van toepassing op de runtime-fouten / waarschuwingen.
Misschien dit: error_reporting(E_ALL | E_STRICT | E_COMPILE_ERROR); is ook een kijkje waard

Bottom line:
Stel de foutrapportage zo veel mogelijk in de php.ini-bestanden in.


2
2017-11-06 17:15