When you have that much magic behavior it puts a large burden on the programmer to learn all of it . ScenarioInitial Programmer A function named empty hmm sounds like I can use it to check all my form elements are filled in . Hmm , if it ' s empty I ' ll throw an error . Yay , seems like everything is working . No issues occur for months . The first guy leaves to work on newer and better projects that aren ' t in PHP , A replacement gets hired . Someone from the business decides they want to ask , in a text box . How many cats do you own ? If you have any , what are there names ? People go along typing things like Zero cats etc . Months go by without issue . Eventually one user complains . I can ' t get your form to work . It keeps telling me I didn ' t fill out how many cats I own , when I totally did . The new programmer eventually figures it out ahh , the user typed exactly 0 , which happens to be coerced to a number and empty evaluate to true . Figures out hmm , the original programmer probably wanted arraykeyexists . The problem is , this already resulted in a user facing error and an hour of time or so wasted because PHP chose to do the unintuitive thing . Now , it could have been better documented . The initial programmer could have thoroughly read the documentation for empty . They could have written tests for this exact scenario if they expected it to come up . The user could have tried changing their answer when they got the error message . But why do you want to use a language where issues like this are commonplace ?