Dentro de POO, en vez de register_shutdown_function se pueden establecer destructores para que se ejecuten al dejar de existir el objeto.
Constructores y Destructores, pero el problema que tiene es que no podés manejar el orden que se llama ni asegurar que se ejecuten al final, sino cuando se pierden todas las referencias al objeto.