Jump to content
php.lv forumi

Singleton Abstract Class


Steve

Recommended Posts

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;
   }

}

Link to comment
Share on other sites

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 ( ) ;
?>

 

Link to comment
Share on other sites

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...

Link to comment
Share on other sites

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 :)

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 by Steve
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...