por lo que quiero ser capaz de añadir/eliminar los métodos de clase en tiempo de ejecución. Antes de que me digas que es una práctica horrible en un principio, podría ser, pero realmente no me importa. La razón por la que deseo poder hacer esto es porque quiero que la aplicación sea muy modular, por lo que algunos complementos podrían ampliar alguna clase base y agregar métodos sin matar a la aplicación principal.PHP modificación de clase en tiempo de ejecución
Por ejemplo, decir que tengo la clase siguiente:
class User {
protected $Id;
protected $Name;
protected $Password;
protected $PostsPerPage;
}
Y digo, algunos plugin añade la posibilidad de que los usuarios cambiar sus ajustes de visibilidad, la adición de un $ propiedad visible en la clase. La clase se convertiría en:
class User {
protected $Id;
protected $Name;
protected $Password;
protected $PostsPerPage;
protected $Visible;
}
Esto podría lograrse a través de __get y __set, pero la aplicación más común es para obtener y establecer las propiedades de ejecución generado, y que sería una molestia para pseudo código captadores y definidores para cada propiedad agregada, así como el uso de __set es un no-no en mi opinión.
La otra idea que tuve fue almacenar la configuración del usuario por separado, en otra matriz como $ UserVisiblitySettings [userid], pero eso no hace que las cosas sean como OO como me gustaría.
siguiente idea era hacer una clase de ayuda, algo como esto:
class UserHelper {
public function SetVisiblity($user_object,value);
}
Entonces, podría usar __get y __set para implementar "amigos" métodos/clases, pero que suena demasiado hacker. Si tuviera que ir por ese camino también podría sobrecargar __call, __get y __set. Además, no estoy tan seguro de que esta sea una buena práctica de OOP, y se vería feo también.
La última idea que tenía era tener alguna función para crear clases dinámicamente en tiempo de ejecución mediante el uso de eval() (esta es la única válida uso de eval pude llegar a también). Básicamente, obtenga la definición de la clase de un archivo, haga una búsqueda simple de corchetes para encontrar los corchetes de apertura y cierre de la clase y envíelos a eval.
Usando runkit está fuera de cuestión, ya que es obsoleto y prefiero no forzar al usuario a instalar alguna extensión.
Cuando miro a mis ideas, la más sencilla y menos intensivo de la CPU parece ser sobrecargar _call y añadir una forma de que los métodos que se registran en la clase.
Por favor, cualquier pensamiento que no son "no hacen esto" son apreciados.
Esencialmente usted está buscando un homólogo de extender incluir mecanismo (http://ruby-doc.org/core/classes/Object.html#M000335) o (en cierta medida) los métodos de extensión de rubí/C# 's (http://msdn.microsoft.com/en-us/library/bb383977.aspx)? – VolkerK
Exactamente como los métodos de extensión de C# – stelonix