View Full Version : Chi mi spiega questo codice PHP?
Frenky-90
15-03-2019, 22:02
<?php
/*
* Template Class
* Creates a template/view object
*/
class Template {
//Path to template
protected $template;
//Variables passed in
protected $vars = array();
/*
* Class Constructor
*/
public function __construct($template){
$this->template = $template;
}
/*
* Get template variables
*/
public function __get($key){
return $this->vars[$key];
}
/*
* Set template variables
*/
public function __set($key, $value){
$this->vars[$key] = $value;
}
/*
* Convert Object To String
*/
public function __toString(){
extract($this->vars);
chdir(dirname($this->template));
ob_start();
include basename($this->template);
return ob_get_clean();
}
}
Per esempio da file index php gli invio questo codice
// Ha la config con la connessione db e i parametri
<?php require('core/init.php'); ?>
<?php
//Create Topic Object
//E' tipo un model(non è MVC) dove mi creo un metodo per esempio per mostrare ciò che c'è nel database
$topic = new Topic;
//Get Template & Assign Vars
//Passa al costruttore della classe template un path di una view
$template = new Template('templates/frontpage.php');
//Assign Vars
//assegna ad una variabile e al template la collection presa dal db
$template->topics = $topic->getAllTopics();
//Display templates
echo $template;
?>
In poche parole vorrei che spiegaste a mia nonna come funzionano quei metodi magici della classe template.. Grazie
pabloski
16-03-2019, 09:08
In che senso come funzionano?
I metodi magici sono questi http://php.net/manual/en/language.oop5.magic.php
E sono invocati dal runtime in momenti prestabiliti. I construttori quando si istanzia un nuovo oggetto di una classe. toString quando il contesto obbliga ad una conversione in stringa, ecc...
Per esempio
echo $template;
implica una conversione in stringa, altrimenti cosa visualizzeresti? In questo caso è come se stessi dicendo
echo $template->__toString();
solo che lo fa il runtime implicitamente.
Frenky-90
16-03-2019, 12:42
Si in grandi linee la sò..
Per esempio io passo questa collection tramite variabile $topics: $template->topics = $topic->getAllTopics();
cosa fà il metodo _get? organizzato in questo modo?
public function __get($key){
return $this->vars[$key];
}
Quella variabile $key cosa prende?
e poi il metodo __set()?
public function __set($key, $value){
$this->vars[$key] = $value;
}
cosa setta?
extract del metodo toString trasforma in variabile la chiave array e come valore gli attribuisce il value dell'array?
il chdir del metodo to string cambia la directori nel file dove si chiama in questo caso index.php?
ob_start carica tutto nel buffer
la include() ,inclde la view nel file index vero?
ob_get_clean() recupare quello che c'è nel buffer e lo stampa
Se hai un pò di tempo delucidami sulle domande poste. Grazie Saluti!
pabloski
16-03-2019, 14:00
Si in grandi linee la sò..
Per esempio io passo questa collection tramite variabile $topics: $template->topics = $topic->getAllTopics();
cosa fà il metodo _get? organizzato in questo modo?
No. In quel caso viene invocato il setter ( __set ). E quello che fa è assegnare al hash table vars.
Cioè nel tuo caso fa
$this->vars['topics'] = $value; // $value è il risultato di $topic->getAllTopics()
Mentre questa fa l'inverso
public function __get($key){
return $this->vars[$key];
}
cioè restituisce il contenuto di vars['nome proprieta'], nome proprietà è contenuto in $key. Il perchè sono "metodi magici" è che tu __get lo usi così
$mia_variabile = $template->pippo; // notare che __get non compare da nessuna parte
PHP va nella classe, vede che non esiste un attributo/variabile chiamato pippo. A questo punto chiama __get ( se esiste ) automaticamente
$this->__get('pippo');
Questo è quello che ritorna al chiamante. Se invece l'attributo/variabile pippo esiste già, allora semplicemente restituisce il valore che vi è contenuto.
extract del metodo toString trasforma in variabile la chiave array e come valore gli attribuisce il value dell'array?
L'array vars non è una chiave, è un hash table ( array associativo ). Al suo interno sono contenute n chiavi, ognuna con un certo contenuto associato ( che può essere complesso a piacere, quindi pure altri array, classi, hash table ).
Quello che fa extract è incredibile http://php.net/manual/en/function.extract.php
Se guardi l'esempio nella pagina che ho linkato
$size = "large";
$var_array = array("color" => "blue",
"size" => "medium",
"shape" => "sphere");
extract($var_array, EXTR_PREFIX_SAME, "wddx");
echo "$color, $size, $shape, $wddx_size\n";
Notato? Ha creato da zero le variabili $color, $shape, $wddx_size partendo dalle chiavi color, size e shape dell'array associativo.
Perchè wddx_size? Perchè esiste già una variabile chiamata size.
Poi chdir cambia la directory corrente. Basename estrae il nome del file da un path completo. Include include il file.
ob_start --> attiva il buffering, cioè l'output non viene mandato immediatamente al client
ob_get_clean --> cancella il buffer in cui è stato memorizzato l'output. Se volessi invece inviarlo, useresti ob_end_flush
Perchè fa una cosa che sembra stupida? Perchè quando va ad includere l'altro file, potrebbero venire prodotti output indesiderati ( se ricordo bene pure i warnings finiscono nell'output ). Per evitare che al client venga inviata schifezza, semplicemente fa in modo che finisca in un buffer, che viene poi completamente cancellato, azzerato.
Frenky-90
16-03-2019, 14:45
ecco un var_dump di $topics
array(1) { [0]=> object(stdClass)#7 (10) { ["id"]=> string(1) "1" ["category_id"]=> string(1) "1" ["user_id"]=> string(1) "1" ["title"]=> string(23) "Php an awesome Language" ["body"]=> string(35) "Whit php you can do a lot of things" ["last_activity"]=> string(19) "0000-00-00 00:00:00" ["create_date"]=> string(19) "2019-03-13 12:56:04" ["username"]=> string(10) "pippo" ["avatar"]=> string(11) "avatar1.jpg" ["name"]=> string(15) "Web Programming" }
Il metodo get chiama praticamente variabili inesistenti nella classe.
Allora il primo metodo ad essere chiamato è __set
_set($topics, $iValoriDiTopics){
$this->vars[$topics] = $iValoriDiTopics;
}
e poi il metodo get__
__get($leChiaviArrayDiTopics){
return $this->vars[$leChiaviArrayDiTopics]; //che sono 'id', 'category_id' ecc
}
pabloski
16-03-2019, 17:08
contiene un solo elemento?
comunque no, vars è un array associativo a cui vai ad aggiungere la chiave topics quando fai
$template->topics = $topic->getAllTopics();
a quella chiave verrà assegnato l'array che hai postato
quando fai
$miavar = $template->$topics;
che è equivalente a
$miavar = $template->__get('topics');
che ti restituisce il contenuto di vars['topics']...è topics la chiave
otterrai di nuovo tutto l'array...poi dovrai essere tu a scorrerlo ed accedere alle chiavi username,title,ecc...
Frenky-90
16-03-2019, 18:46
Ho capito grazie..
No non è tutto quello l Array... Ho copiato solo il primo e ho modificato a mano per fare sembrare che e solo uno..
..
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.