Steve Posted February 6, 2011 Report Share Posted February 6, 2011 Pieņemsim man ir šāda singletona klase kura man vajadzīga PDO MySQL datubāzes izmantošanai, tas ir tāpēc lai netaisītu lieki pārāk daudz PDO objektus. Man izsauc to, ka $DBH nav nemaz nodefinēts šajā klasē, tas nozīmē, ka tas visu laiku ir = null. <?php abstract class Singleton { protected $DBH; public static function getInstance() { if ($DBH == null) { $DBH = new static(); } return $DBH; } } Ja es daru šādi man tā notice nerādās, bet tad nosacījums iekš tā IF'a vienmēr izpildās, pareizi? <?php abstract class Singleton { protected $DBH; public static function getInstance() { $DBH = ""; if ($DBH == null) { $DBH = new static(); } return $DBH; } } Tad varbūt tas IF's nemaz tur nav vajadzīgs un es varu šo klasi atstāt šādu? <?php abstract class Singleton { protected $DBH; public static function getInstance() { $DBH = new static(); return $DBH; } } Quote Link to comment Share on other sites More sharing options...
daGrevis Posted February 6, 2011 Report Share Posted February 6, 2011 Re ku' no php.net... <?php class Database { private static $link = null ; private static function getLink ( ) { if ( self :: $link ) { return self :: $link ; } $ini = _BASE_DIR . "config.ini" ; $parse = parse_ini_file ( $ini , true ) ; $driver = $parse [ "db_driver" ] ; $dsn = "${driver}:" ; $user = $parse [ "db_user" ] ; $password = $parse [ "db_password" ] ; $options = $parse [ "db_options" ] ; $attributes = $parse [ "db_attributes" ] ; foreach ( $parse [ "dsn" ] as $k => $v ) { $dsn .= "${k}=${v};" ; } self :: $link = new PDO ( $dsn, $user, $password, $options ) ; foreach ( $attributes as $k => $v ) { self :: $link -> setAttribute ( constant ( "PDO::{$k}" ) , constant ( "PDO::{$v}" ) ) ; } return self :: $link ; } public static function __callStatic ( $name, $args ) { $callback = array ( self :: getLink ( ), $name ) ; return call_user_func_array ( $callback , $args ) ; } } ?> <?php // examples $stmt = Database :: prepare ( "SELECT 'something' ;" ) ; $stmt -> execute ( ) ; var_dump ( $stmt -> fetchAll ( ) ) ; $stmt -> closeCursor ( ) ; ?> Quote Link to comment Share on other sites More sharing options...
marcis Posted February 6, 2011 Report Share Posted February 6, 2011 (edited) Domāju, ka tu meklē self keywordu. abstract class Singleton { protected static $DBH; public static function getInstance() { if (!isset(self::$DBH)) { self::$DBH = new static(); } return self::$DBH; } } Un tev tiešām šeit vajadzīga abstrakta klase? :) Edited February 6, 2011 by marcis Quote Link to comment Share on other sites More sharing options...
Steve Posted February 7, 2011 Author Report Share Posted February 7, 2011 Un tev tiešām šeit vajadzīga abstrakta klase? :) Nu jā, jo man ir tā, ka vairākas klases darbojas ar DB un piem kad viena klase jau darbojas ar DB izsauc otru klasi, kura arī darbojas ar DB un tad rodas scope errori. Cik noprotu šis ir optimālākais risinājums... Quote Link to comment Share on other sites More sharing options...
daGrevis Posted February 7, 2011 Report Share Posted February 7, 2011 Ja nav žēl, lūdzu parādi, ko beigās būsi izveidojis. Gribu saprast Tavu domu gājienu. Quote Link to comment Share on other sites More sharing options...
Steve Posted February 7, 2011 Author Report Share Posted February 7, 2011 Ja nav žēl, lūdzu parādi, ko beigās būsi izveidojis. Gribu saprast Tavu domu gājienu. Jā, bez problēmām. Šī ir funkcija kategoriju klasē kura pievieno kategoriju, bet arī izmantojot logu klasi pievieno jaunu ierakstu logos. public static function Add($catName, $catDescr = "", $catImgURL = "", $catSubLevel = 0, $catSubID = 0) { try { $DBH = DBAccess::getDBH(); //Preparing our SQL Query $values = array($catName, $catDescr, $catImgURL, $catSubLevel, $catSubID); $STH = $DBH->prepare("INSERT INTO cat (catName, catDescr, catImg, catSubLevel, catSubID) VALUES (?, ?, ?, ?, ?)"); //Excecuting SQL Query $STH->execute($values); //Cleaning up $DBH = null; $STH = null; //Writing down log <----------------------------- include "mLog.php"; Log::Add("Added category " . $catName); //Returning true for user to know that it was successful return true; } catch (PDOException $e) { //If we have error, we show it (it will be shown only if debug mode is enabled in db_config.php echo $e->getMessage(); } } Šī ir funkcija, kas pievieno jaunu ierakstu logos. Šo funkciju izmanto ļoti bieži citos php failos... public static function Add($action) { try { $DBH = DBAccess::getDBH(); //Getting user IP $ip = $_SERVER['REMOTE_ADDR']; //Getting time $time = date('Y-m-d H:i:s'); //Preparing our SQL Query $values = array($ip, $action, $time); $STH = $DBH->prepare("INSERT INTO log (ip, action, time) VALUES (?, ?, ?)"); //Excecuting SQL Query $STH->execute($values); //Cleaning up $DBH = null; $STH = null; } catch (PDOException $e) { echo $e->getMessage(); } } Kā redzi izpilda darbības ar datu bāzēm iekš darbībām ar datubāzēm, ja es netaisu singletonu man rodas scope errori, ja es visu laiku inkludēju dbaccess failu kurš taisa $DBH tad man taisās ļoti daudzas instances, kas nav īpaši produktīvi. Šis ir vienīgais risinājums kuru es zinu šai problēmai :) Quote Link to comment Share on other sites More sharing options...
v3rb0 Posted February 7, 2011 Report Share Posted February 7, 2011 gadījumā ja ok return true; un bez return gadījumā ja kļūda echo $e->getMessage(); labāk būtu vai nu atgriezt true/false, vai atļaut metodei izmest exceptionu, vai ..kaut vai bez return un ar echo tur kur vajag ko userim paziņot, bet nejaukt kādā veidā metode ko atgriež vai kādu output'u veido. Quote Link to comment Share on other sites More sharing options...
Steve Posted February 7, 2011 Author Report Share Posted February 7, 2011 (edited) gadījumā ja ok return true; un bez return gadījumā ja kļūda echo $e->getMessage(); labāk būtu vai nu atgriezt true/false, vai atļaut metodei izmest exceptionu, vai ..kaut vai bez return un ar echo tur kur vajag ko userim paziņot, bet nejaukt kādā veidā metode ko atgriež vai kādu output'u veido. True DAT! Vienkārši kamēr es testēju es atgriežu to MSG, vēlāk, kad nogriezīšu iekš PDO warningus 'n shit es returnošu false tajā vietā. Vismaz tāds ir pagaidām plāns Edited February 7, 2011 by Steve Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.