buonasera
può una classe php estendere se stessa runtime? se si, con che logica e limiti?
![]()
buonasera
può una classe php estendere se stessa runtime? se si, con che logica e limiti?
![]()
Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle
il mio profilo su PHPClasses e il mio blog laboweb
Intendi dire attraverso i magic methods come __call, __get, __set?
direi di si, se questi possono rappresentare la mia soluzione... link utili?
Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle
il mio profilo su PHPClasses e il mio blog laboweb
il mio scopo è quello di creare ed eliminare metodi runtime all' interno di una classe. sò che c'è ovviamente la possibilità di estendere una classe, ma se volessi delegare il lavoro a se stessa?
cioè la classe pippo la quale, tramite una funzione creata da me, si estenda (magari utilizzando self per esempio)
Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle
il mio profilo su PHPClasses e il mio blog laboweb
Non sono sicuro di aver capito perfettamente, ma forse intendi una cosa del genere?
Codice PHP:
<pre>
<?php
class MyClass {
public function __call($name, $arguments) {
if (function_exists($name)) {
$name($this, $arguments);
}
}
}
function my_function (&$obj, $arguments) {
print_r($arguments);
}
$obj = new MyClass();
$obj->my_function('arg 1', 'arg 2');
?>
</pre>
NI
mi spiego meglio....
Codice PHP:
class pippo{
function createMethod($name,$args,$code){
if (!/*non esiste come metodo di questa classe*/){
/*estendi pippo (o self?) con un metodo di nome $name, che accetta $args, il cui codice è $code*/
}
}
}
Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle
il mio profilo su PHPClasses e il mio blog laboweb
Quello che ho scritto mi fa un po' vergognare, ma non saprei in che altro modo si possa implementare quello che chiedi:
Codice PHP:
<pre>
<?php
class MyClass {
var $_methods = array();
function createMethod($name, $args, $code){
$this->_methods[$name]['code'] = $code;
$this->_methods[$name]['args'] = $args;
}
function __call($name, $args) {
if (!method_exists($this, $name) && isset($this->_methods[$name])) {
if (count($args) == count($this->_methods[$name]['args'])) {
$args = array_combine($this->_methods[$name]['args'], $args);
return $this->_call_method($this->_methods[$name]['code'], $args);
}
}
}
function _call_method($___code, $___arguments) {
extract($___arguments);
return eval($___code);
}
}
$obj = new MyClass();
$obj->createMethod('my_function', array('arg1', 'arg2'), 'print("{$arg1}\r\n"); var_dump($arg2);');
$obj->my_function('arg 1', 'arg 2');
?>
</pre>
io nn capisco come una cosa del genere possa essere utile a qualcuno. Boh, forse perché ho avuto a che fare (temporalmente parlando) con Pascal/C/C++, cui questo genere di cose sono estranee...
magari spiegando meglio il problema si possono proporre soluzioni diverse.
Nell'anno 1968 è bastata la potenza di due Commodore 64 per lanciare con successo una navicella sulla Luna; nell'anno 2007 ci vogliono la potenza di un processore quad core 3.30 GHz e 3 Gb di RAM (requisiti minimi ufficiali) per utilizzare Windows Vista. Qualcosa deve essere andato storto!
rieccomi qui
grazie intanto a filippo, la strada penso sia quella giusta, stasera farò delle verifiche e dei test e proverò.
@Hysoka:
la 'cosa del genere' è utile, se non utilissima, e questa mia domanda è parte di un progetto ben più grande e complesso.
Fondamentalmente si tratta di riuscire, in termini logici, a replicare certe peculiarità di altri linguaggi applicate ai dati gestiti da php.
a partire dal presupposto che php mette a disposizioni la possibilità di salvare gli stati dele classi (se pur in certi versi limitata) tramite serializzazione delle stesse e quindi la ricostruzione della stessa in sessioni di lavoro successive.
un astratto del mio intento:
nella struttura portante della classe MainClass verrà gestito una sorta di 'listner' virtuale , il quale sarà richiamato al momento giusto sul dato richiesto.Codice PHP:
$t=new MainClass;
$t->variabile=10;
$t->addEventListner('change','variabile','if (variabile > 10) echo "maggiore di 10";');
Per qualcuno potrà sembrare una snaturalizzazione, un' accrocchio o una porcata, ma ha un suo valore pratico.
Sono aperto a tutte le opinioni![]()
Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle
il mio profilo su PHPClasses e il mio blog laboweb