Comprender str_pad () con ceros a la izquierda

Intento crear una función php y descubrí un comportamiento extraño y ni siquiera puedo formular una pregunta adecuada, por lo que si alguien puede explicar lo que está sucediendo, lo agradecería.

Estoy trabajando con un conjunto de números con ceros a la izquierda, y es importante que se mantengan, pero los usuarios casi nunca ingresan ceros a la izquierda. Entonces uso esto:

$x = 123; $n = 5; $x = str_pad((int)$x,$n,"0",STR_PAD_LEFT); echo $x; 

y, según lo deseado, esto me da 00123.

Las cosas raras suceden cuando probé para un usuario que ingresa un cero antes de su número

 $x = 0123; $n = 5; $x = str_pad((int)$x,$n,"0",STR_PAD_LEFT); echo $x; 

Esto devuelve 00083. Lo mismo sucede si un usuario ingresara 00123.

Ese resultado me tiene completamente desconcertado. Gracias de antemano por cualquier explicación de lo que está pasando aquí.

Los literales enteros que comienzan con 0 se interpretan como base 8 . Su segundo $x tiene el valor 83. Consulte el manual en enteros para más detalles.

La función intval() permite especificar la base si está leyendo una cadena de usuario.

Si hablamos de literales, en PHP el literal 0 es decimal, mientras que en C y C ++ es octal. Son las pequeñas diferencias las que hacen que la vida sea divertida.