Both strtotime() - PHP's "take a string and do your damnedest to make a date out of it" function - and DateTime.parseFromFormat() - the more restrictive TZ-aware class - accept it and give you March 2/3. There's a separate validate_date() or something like that that actually rejects Feb 31.
I'm not sure that's entirely wrong, just a different attitude than you might expect. Also, for that matter, I think MySQL accepts, will store, and will retrieve Feb 31 IIRC. Why? It's liberal in the correctness of input.