Ez a magic methodos dolog sántít, mivel, ha csinálok egy ilyet:
class Foo {}
Akkor ettől ennek még nem lesz egyetlen __ metódusa sem, mivel nincs base object (saját rendszerben mindenki csinálhat magának, nyilván).
---
Ez típusossági problémát már kicsit túlpörgitek, ha valamit osztály segítségével lehet rendesen leírni, használjunk osztályt.
Ha valami jó primitívként, használjunk primitívet, akár úgy, hogy a metódus bemenő paraméterét felülvágjuk (pl. strval()-lal), senki sem izgat, ilyen módon engem nem zavar, hogy nem kell kiírni mindenhová, hogy int, float, string (array, class/interface név nekem elég, callable még jó lenne, de legalább van Closure).
Abban az esetben, ha valami primitívnek tűnik, de nem az, akkor C#-ban és Java-ban is bevezetek egy olyan saját típust, ami segít leírni, miről is van szó (SSN-t nem numerikus értékként, string-ként használunk, hanem van rá SocialSecurityNumber nevű osztály), ezt szinte mindenhol meg lehet tenni.