Buongiorno a tutti,
sto sviluppando un progetto in stile OOP per avvicinarmi a questo concetto di programmazione e grazie alla vasta gamma di notizie in rete (anche se molte ripetute a non finire) mi riesce tutto abbastanza semplice, però ci sono alcuni concetti che mi sfuggono e quindi vorrei esporli qui di seguito:
Ho creato una classe astratta per una connessione tramite mysqli, e poi con classi derivate inserisco i dati per i vari utenti del db mysql poichè ne ho vari (per aumentare la sicurezza) ed ognuno di questi ha privilegi diversi e limitati. Nella classe ho incluso come metodi :
Codice PHP:
//...
public function connection() {
$this->getUser();
$this->getPassword();
$this->getHost();
$this->getDb();
new mysqli($this->getHost(), $this->getUser(), $this->getPassword(), $this->getDb());
if (mysqli_connect_errno()) {
printf("Connessione al database fallita.");
exit();
}
}
public function disconnection() {
mysqli_close();
}
ma mi sorge un dubbio, dovendo fare la query al db, supponendo che una volta richiamata la classe ed averla assegnata ad una variabile di nome $db, dovrei fare $db->query (almeno cosi faccio quando programmo ibrido tra oop e procedurale) però questa volta non ho mysqli impostato a $db:
Codice PHP:
$db= new mysqli(...);
$db->query('...');
ma ho una classe che richiama la connessione, e quindi per impostare la query devo forse includere nella classe un metodo cosi ?
Codice PHP:
public function query($query) {
mysqli_query($query);
}
o funzionerebbe comunque la query?
altrimenti come dovrei fare?
E per concludere con questo quesito, questo metodo sarebbe sicuro, oppure rischio una manipolazione della flusso e senza controlli di sorta(non è questo un campo di imput ma una query di lettura da codice ma è bene sapere eventuali problemi) nella stessa classe?
Di solito i controlli li applico subito quando ricevo i dati alle variabili con htmlentities e/o addslashes.
es.
Codice PHP:
// usando la forma abbreviata di controllo se vero o falso
$var= if(isset($_GET['var'])) ? htmlentities($_GET['var']) : null;
Poi passando ad un'altro quesito (ne approfitto per esporre ora tutti i miei problemi):
avendo scritto una classe per l'inclusione delle template e la sostituzione dei 'placeholder' per i contenuti dinamici, quando costruisco la classe dichiaro : __construct($template) che viene richiamato con : new template(URI); e sempre nella costruzione imposto una variabile che contiene il codice del template ($code), tutto ciò tramite file_get_contents.
Al termine per liberare la memoria distruggo la classe e nella distruzione metto anche : unset($code); per liberare la variabile che ormai ha già, tramite altra funzione, restituito il codice modificato tramite foreach. Il quesito è... nel metodo __destruct() devo mettere __destruct($template) o basta __destruct() per eliminare anche quella variabile che è stata immessa nella costruzione?(appunto $template)
per facilitarvi la comprensione posto di seguito il codice:
Codice PHP:
<?php
class addTemplate {
var $code;
function __construct($template) {
$this->code= file_get_contents($template);
}
public function replaceTag($replacers){
foreach($replacers as $key => $value){
$this->code= str_replace("<!".$key."!>", $value, $this->code);
}
}
public function getTemplate() {
return $this->code;
}
function __destruct(){
unset($this->code);
}
}
?>
Quindi concludendo con due semplici domande (perdonatemi lo stress :-( ):
-quando dichiaro una classe ereditaria devo includere prima di aprire la classe, semplicemente (tramite require_once o altro metodo) la classe madre, vero?
- ho implementato una funzione __autoload per caricare dinamicamente le classi che mi servono e ho impostato l'url in modo che dal file in cui serve la classe, si possa giungere nella cartella 'classes', ma non c'è un modo per far indirizzare dinamicamente la classe verso tale cartella sia che io sia nella root o una cartella di pari livello ? (lo sò che è una stupidaggine, ma forse si può risolvere con una funzione ed io non lo sò per questo nell'eventualità
...).
D'accordo, concludo qui (lo prometto!), spero che questo sia un'argomento utile ed interessante a molti e che possa trovare le mie risposte, grazie mille ! Se sono stato poco chiaro (chiedo scusa e so che lo sono stato) per via dei molti argomenti vi prego di chiedermi delucidazioni e risponderò quanto prima.
Buona giornata.