php eval - raar gedrag

Als je moest raden wat de uitvoer van de volgende php-code zal zijn:

$str = "011";
eval("\$num = $str;");
echo "number is: ".$num;

Ik wed dat je nooit "9" zou zeggen. Nou, ik ook niet ...
Ik zou graag een verklaring voor dit bizarre gedrag horen!

1
@Tadeck je bent inderdaad een ervaren ontwikkelaar - veel te doen!
toegevoegd de auteur alfasin, de bron
@ Thrustmaster Ik denk dat ik een soort verklaring verschuldigd ben, omdat ook ik denk dat "eval is evil". nou, ik moest strings nemen die wiskundige uitdrukkingen bevatten (zoals: "1 + 2 + 3") en het resultaat berekenen. sommige nummers kunnen een voorloopnul hebben - zo ben ik er tegenaan gelopen.
toegevoegd de auteur alfasin, de bron
@ C0deH4cker mijn laatste opmerking verklaart ook waarom ik string-replace (nullen kan op "legitieme" plaatsen zijn niet kan gebruiken, dus ik kan ze niet gewoon "verwijderen").
toegevoegd de auteur alfasin, de bron
nadat ik er tegenaan liep en geen ander alternatief zag, schreef ik een mini-parser en berekende ik de uitdrukkingen ...
toegevoegd de auteur alfasin, de bron
@ C0deH4cker sinds het verwijderen van de voorloopnullen parsen vereist, ik verkoos de uitdrukking te berekenen tijdens het parsen. het bleek sneller te zijn.
toegevoegd de auteur alfasin, de bron
@Tadeck het zal nog steeds een soort van parsering vereisen - maar aangezien "eval" het enige alternatief is voor volledige parsen, zal ik het een kans geven. bedankt!
toegevoegd de auteur alfasin, de bron
Als dit ongewenst gedrag is, probeer dan alle toonaangevende '0's en' 0x's (dat betekent hexadecimale waarden) te verwijderen.
toegevoegd de auteur C0deH4cker, de bron
Verwijder de toonaangevende '0's. Dat is wat ik in mijn eerdere opmerking noemde. Verwijder niet alle '0's.
toegevoegd de auteur C0deH4cker, de bron
Ik zou zeggen " 9 ". Dat geldt ook voor de meerderheid van mijn collega's en de reden is zeer duidelijk voor ervaren ontwikkelaars.
toegevoegd de auteur Tadeck, de bron
@alfasin: Hoe zit het met het eerst casten van een string naar integer? Past het bij uw behoeften? Zie ideone.com/BjF4D
toegevoegd de auteur Tadeck, de bron
Voordat ik de uitvoer raad, zou ik eerst zeggen: 'eval ?? Is er geen andere manier? '
toegevoegd de auteur SuperSaiyan, de bron

1 antwoord

Het starten van een cijfer met een voorloop 0 geeft basis 8 aan, waarin 11 is 9.

Still confused? Read this: http://en.wikipedia.org/wiki/Octal

5
toegevoegd
wauw, dat was snel :) bedankt!
toegevoegd de auteur alfasin, de bron