Nog even hierover:
Zolang er geen sprake is van verschillende typen aan weerszijden van een operator is het niet relevant dat je waarde lijkt op een waarde van een ander type. Er hoeft geen conversie van typen plaats te vinden (en het mag imho ook niet) omdat je gewoon werkt met strings en dus moet er ook gewoon een string-comparison plaatsvinden, geen cast naar ints en die vergelijken...
Ik zou het dus een bug noemen, niet 'logisch want het is loose typed'. Het zijn tenslotte dezelfde typen en dan hoort de vergelijking op basis van de standaard comparator binnen die typen te gebeuren, imho dan... === voegt alleen toe dat je eerst checked dat je dezelfde typen hebt en dan daarbinnen dezelfde waarden.
Dus 1 == '1' = true maar 1 === '1' = false
"a" = "0a" is false, om welke reden zou dan precies de string '123' gelijk moeten zijn aan de string '0123' ? En waarom geldt dat dan weer niet voor '123 bar' vs '0123 bar' ? En waarom is '000000000123' gelijk aan '123' ?
Magoed, blijkbaar zijn ze het bij php niet eens dat het een bug is. Imho zou iemand die bovenstaand gedrag per se wil hebben gewoon ltrim($var, '0') moeten doen... maarja.