ok, d'abord, je suis d'accord que c'est de mauvaises manières. aussi, en 5.3, vous pourriez utiliser la nouvelle syntaxe de fermeture avec le mot magique __call pour utiliser les opérateurs en tant que fonctions (style JS). Maintenant, si nous voulons fournir un moyen de le faire de cette façon, je peux penser à utiliser create_fnuction, mélangé avec la magie __ call. En gros, vous utilisez un modèle regex pour convertir les fonctions en chaînes compatibles et les mettre dans un membre privé. que vous utilisez la méthode __call pour les récupérer. Je travaille sur une petite démo.
ok, voici la classe. Je suis inspiré d'une classe que j'ai vu il y a quelques semaines qui ont utilisé des fermetures pour mettre en œuvre des objets de style JS:
/**
* supplies an interface with which you can load external functions into an existing object
*
* the functions supplied to this class will recive the classes referance as a first argument, and as
* a second argument they will recive an array of supplied arguments.
*
* @author arieh glazer <[email protected]>
* @license MIT like
*/
class Function_Loader{
/**
* @param array holder of genarated functions
* @access protected
*/
protected $_funcs = array();
/**
* loads functions for an external file into the object
*
* a note- the file must not contain php tags.
*
* @param string $source a file's loaction
*
* @access public
*/
public function load($source){
$ptrn = '/function[\s]+([a-zA-Z0-9_-]*)[\s]*\((.*)\)[\s]*{([\w\s\D]+)}[\s]*/iU';
$source = file_get_contents($source);
preg_match_all($ptrn,$source,$matches);
$names = $matches[1];
$vars = $matches[2];
$funcs = $matches[3];
for ($i=0,$l=count($names);$i<$l;$i++){
$this->_funcs[$names[$i]] = create_function($vars[$i],$funcs[$i]);
}
}
public function __call($name,$args){
if (isset($this->_funcs[$name])) $this->_funcs[$name]($this,$args);
else throw new Exception("No Such Method $name");
}
}
1er limitations-, la source ne peut pas avoir des balises php. 2ème, les fonctions seront toujours publiques. 3ème- nous pouvons seulement imiter $ this. ce que j'ai fait était de passer comme un premier argument $ this, et le second est le tableau d'arguments (qui est une 4ème limite). De plus, vous ne pourrez pas accéder aux membres et aux méthodes non publiques à partir de la classe. un exemple pour un fichier source:
function a($self,$arr=array()){
//assuming the object has a member called str
echo $self->str;
}
ce fut un exercice amusant pour moi, mais une mauvaise pratique dans l'ensemble
$ registry est juste une classe pour stocker des fonctions et des variables pour un accès global. – saint