Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    Niubbo OOP: problema di scope?

    Sto cercando di utilizzare la seguente classe
    codice:
    <?php
    
    class MySQL {
    	
    	var $host; 
    	var $user;
    	var $pass;
    	var $data;
    	var $link;
    	
    	public function MySQL() { // Costruttore
    		
    		$param = func_get_args();
    		foreach($param as $arg) {
    			if(!isset($arg) || strlen(trim($arg)) == 0)
    				die("Parametri di connessione non validi!");
    		}
    		
    	}
    	
    	public function setConfig($host, $user, $pass) {
    		$this->host = $host;
    		$this->user = $user;
    		$this->pass = $pass;
    	}
    	
    	public function Connect() {
    		
    		$this->link = mysql_connect($this->host, $this->user, $this->pass) 
    						or die("Impossibile creare la connessione!");
    		
    		if($this->link)
    			return $this->link;
    		else
    			die("Errore nella connessione al database");
    		
    	}
    	
    	public function SelectDB($db) {
    		
    		if(!isset($db) || strlen(trim($db)) == 0)
    			die("Nome del database non valido!");
    		
    		mysqli_select_db($this->link, $db) or die("Impossibile selezionare il database!");
    		
    	}
    	
    	public function SetCharset($charset) {
    		mysqli_query($this->link, "SET NAMES $charset") or die("Impossibile impostare il charset della connessione");
    		
    	}
    	
    	public function getCon() {
    		return $this->link;
    	}
    	
    }
    
    ?>
    Però quando vado a fare "SelectDB()" o "SetCharset()" mi dice
    Warning: mysqli_select_db() expects parameter 1 to be mysqli, resource given in C:\Programmi\Apache Group\Apache2\htdocs\WestSystems.it\includes\class .MySQL.php on line 44
    Eppure prima dell'utilizzo di "$this->link" faccio
    codice:
    var_dump($this->link);
    mi restituisce
    resource(9) of type (mysql link)
    Non capisco perchè non mi prenda correttamente l'argomento.



    Il resto del codice è:
    codice:
    final class singleton {
    	private static $instances = array();
    	
    	public static function getInstance($class_name) {
    		if(!class_exists($class_name)) {
    			trigger_error("La classe $class_name non esiste!", E_USER_ERROR);
    		}
    
    	    $class_name = strtolower($class_name);
    	    if(!array_key_exists($class_name, self::$instances))
    	    {
    	       self::$instances[$class_name] = new $class_name;
    	    }
    	    
    	    return self::$instances[$class_name];
    		
    	}
    }
    codice:
    $mysql = singleton::getInstance('MySQL');
    
    $mysql->setConfig($db_host, $db_user, $db_pass);
    
    $mysql->Connect();
    $mysql->SelectDB($db_name);
    $mysql->SetCharset($db_charset);
    
    $con = $mysql->getCon();

  2. #2
    Questo codice che cosa restituisce?

    Codice PHP:
    error_reporting(E_ALL);
    ini_set('display_errors'1);

    $mysql singleton::getInstance('MySQL');
    var_dump($mysql);

    $mysql->setConfig($db_host$db_user$db_pass);
    var_dump($mysql);

    $mysql->Connect();
    var_dump($mysql); 

  3. #3
    Originariamente inviato da filippo.toso
    Codice PHP:
    $mysql->($db_name); 
    Non dovrebbe essere:
    Codice PHP:
    $mysql->SelectDB($db_name); 
    ?
    Sìsì, una svista che avevo appena corretto (ma che non risolve il problema). Pardòn.

  4. #4
    Grrrrr!!! Nella conversione da mysql a mysqli avevo tralasciato la connect!!!!

    Mettendo mysqli_connect() ha risolto tutto!

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    Ciao

    In php il costruttore si definisce con
    Codice PHP:
    function __construct() { } 
    Non con il nome della classe

    Poi parlando del design pattern tu hai fatto una classe Factory non una singleton non vorrei ti confondessi col nome.



    Andrea

  6. #6
    Originariamente inviato da andreamk
    In php il costruttore si definisce con
    Codice PHP:
    function __construct() { } 
    Non con il nome della classe
    Non del tutto corretto. In PHP4 come costruttore veniva utilizzato il metodo con lo stesso nome della classe.

    Il PHP 5 supporta lo stesso comportamento per compatibilità all'indietro:

    For backwards compatibility, if PHP 5 cannot find a __construct() function for a given class, it will search for the old-style constructor function, by the name of the class.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    non lo sapevo vengo dalla 5 io
    ma e' deprecato ?

    Se no comincio ad usarlo cosi che mi ricorda piu java.


    Andrea

  8. #8
    Originariamente inviato da andreamk
    Ciao

    In php il costruttore si definisce con
    Codice PHP:
    function __construct() { } 
    Non con il nome della classe
    Si può fare con entrambi.... __construct non mi piace
    Poi parlando del design pattern tu hai fatto una classe Factory non una singleton non vorrei ti confondessi col nome.

    Andrea
    Mmmhhh.... non è che ne capisca molto di pattern (come di OOP del resto).
    Ho seguito un tutorial di HTML.it per realizzarlo.

    Non so che cosa sia una Factory.....

    Ma
    codice:
    if(!array_key_exists($class_name, self::$instances))
    	    {
    	       self::$instances[$class_name] = new $class_name;
    	    }
    non è l'implementazione del singleton? (controllo se esiste l'istanza ed eventualmente la creo o la restituisco)

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    398
    Non proprio.
    Una classe singleton e' una classe che ti impedisce in alcun modo di averne due istanze.
    La tua classe MySql puo essere istanziata diverse volte con new ; pero utilizando la classe singleton che e' una mezza factory la crei una sola volta.


    Per fare una classe singleton per prima cosa devi rendere privato il costruttore della classe stessa.
    Cosi che se fai new ClasseSingleton lo script ti da errore e poi definire una getIstance all'interno della classe che ti restituisca l'istanza.

    Codice PHP:
    class MySql {
    var 
    $host
    var 
    $user;
    var 
    $pass;
    var 
    $data;
    var 
    $link;

    private static 
    istanzaMySql null;


        private 
    __construct() {
        }

    public static function 
    getInstance() {
     if (
    is_null(MySql::$istanzaMySql)) {
        
    MySql::$istanzaMySql = new MySql();
    }
       return 
    MySql::$istanzaMySql;
    }

    .
    .
    .
    il resto della classe


    Cosi facendo l'unico modo per avere un istanza di MySql e' fare MySql::getInstance() e sei sicuro che sia sempre una e una sola istanza in tutto lo script.

    Andrea

  10. #10
    Originariamente inviato da andreamk
    Non proprio.
    Una classe singleton e' una classe che ti impedisce in alcun modo di averne due istanze.
    La tua classe MySql puo essere istanziata diverse volte con new ; pero utilizando la classe singleton che e' una mezza factory la crei una sola volta.
    Qual'è la differenza tra factory e singleton? (ho trovato quel codice sulla pagina che avrebbe dovuto spiegare la singleton )

    Per fare una classe singleton per prima cosa devi rendere privato il costruttore della classe stessa.
    Se faccio così però la classe 'singleton' non può più instanziare oggetti MySQL.... c'è un modo per rendere il costruttore privato ma lasciarlo disponibile alla classe singleton?
    Cosi che se fai new ClasseSingleton lo script ti da errore e poi definire una getIstance all'interno della classe che ti restituisca l'istanza.
    Ma devo quindi modificare la classe 'singleton' o la classe 'MySQL'? Non mi è chiaro....
    Codice PHP:
    class MySql {
    var 
    $host
    var 
    $user;
    var 
    $pass;
    var 
    $data;
    var 
    $link;

    private static 
    istanzaMySql null;


        private function 
    __construct() {
        }

    public static function 
    getInstance() {
     if (
    is_null(MySql::$istanzaMySql)) {
        
    MySql::$istanzaMySql = new MySql();
    }
       return 
    MySql::$istanzaMySql;
    }
    ...
    .

    Cosi facendo l'unico modo per avere un istanza di MySql e' fare MySql::getInstance() e sei sicuro che sia sempre una e una sola istanza in tutto lo script.

    Andrea
    Ma se invece lo istanzio tramite
    Codice PHP:
    singleton::getInstance('MySQL'); 
    ?

    Cosa cambia? Perchè l'articolo non sembra fare differenza!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.