To avoid indexing, make the code immune to (some) changes in fields, avoid global variables, avoid "magic constants", the classic solution in programming languages is to use "named fields." So instead of
PPerson = Person[Name_String, Phone_String, Age_Real, Address_String]
you use
PPerson = Person[{{"Name", Name_String}, {"Phone", Phone_String}, {"Age", Age_Real}, {"Address", Address_String}}]
and define update and access functions like
Modify[p, {"Name", "George"}]
to make the changes you want made. You give your symbols the Orderless attribute so it doesn't matter what order the pairs are given in and I think you have satisfied at least all the requirements you have listed thus far, but I expect more shortly.