2012-11-01 10 views
5

PHP में अपना पहला एप्लिकेशन लिखना जो कक्षाओं और वस्तुओं का उपयोग करता है। मेरे पास एक डीबी कक्षा है जो उपयुक्त कॉन्फ़िगरेशन का चयन करने के लिए एक स्ट्रिंग लेती है क्योंकि कई डेटाबेस हैं। मैंने एक लॉगिन कक्षा के साथ शुरुआत की लेकिन उपयोगकर्ता वर्ग के बदले में उस विचार को खरोंच कर दिया ताकि मैं उपयोगकर्ता-> लॉग इन इन सामान कर सकूं। उपयोगकर्ता वर्ग MySQL का उपयोग करता है जो उपयोगकर्ता और लॉगिन जानकारी संग्रहीत करता है, साथ ही दूसरे डेटाबेस के लिए प्रमाण-पत्र भी संग्रहीत करता है।ओओपी PHP, गाइड अनुरोध, क्लास डिज़ाइन के बीच डेटा साझाकरण

$mysql = new db('mysql'); 

$user = new user($mysql); 
if(!($user->isLoggedIn() === true)) 
{ 
    goToPage('login.php'); 
    exit(); 
} 

दूसरा डेटाबेस साइबेस है और खाता जानकारी संग्रहीत करता है। मुझे यहां से सूचियों और खातों की जानकारी प्राप्त करने के लिए उपयोगकर्ता कक्षा से प्रमाण-पत्र की आवश्यकता है। मुझे लगता है कि एक खाता वर्ग अगले होना चाहिए, लेकिन यह सुनिश्चित करने का सबसे अच्छा तरीका नहीं है। इस शायद कुछ ऐसा ..

$sybase = new db('sybase'); 

$account = new account($sybase); 

$account_list = $account->getList($user->info); 

$ उपयोगकर्ता-> जानकारी एक सरणी मैं क्रेडेंशियल्स और जानकारी खाता तालिका के लिए आवश्यक लगता जा रहा है, या वहाँ इस बारे में जाने के लिए एक बेहतर तरीका है?

संपादित db वर्ग उदाहरण शामिल करने के लिए

config.db.php

$config_array = array(); 

$config_array[ 'mysql' ][ 'dsn' ] = "mysql:host=localhost;dbname=********;charset=UTF-8"; 
$config_array[ 'mysql' ][ 'user' ] = "********"; 
$config_array[ 'mysql' ][ 'pass' ] = "**************"; 

$config_array[ 'sybase' ][ 'dsn' ] = "odbc:DRIVER={Adaptive Server Anywhere 8.0};***************"; 
$config_array[ 'sybase' ][ 'user' ] = "**********"; 
$config_array[ 'sybase' ][ 'pass' ] = "*********"; 

class.db.php

public function __construct($type) 
{ 
    require 'config.db.php'; 

    $this->type = $type; 

    foreach($config_array[ $this->type ] AS $key => $value) 
    { 
     $this->$key = $value; 
    } 

    try 
    { 
     $this->connection = new PDO($this->dsn, $this->user, $this->pass, $this->options); 
    } 
    catch(PDOException $ex) 
    { 
     log_action("db->" . $this->type, $ex->getCode() . ": " . $ex->getMessage()); 
     $this->error = true; 
    } 
    return $this->connection; 
} 

करता है की तरह कुछ निम्नलिखित मतलब ?

class User() 
{ 
    public function getAccountList() 
    { 
     $this->Account = new Account(new Database('sybase')); 
     return $this->Account->list($this->userid); 
    } 
} 

इसके अलावा, लेखा विभिन्न वर्गों (अर्थात इतिहास & नोट्स, वित्तीय लेनदेन, दस्तावेज) उस पृष्ठ की विभिन्न 'टैब' होगा। क्या उनमें से प्रत्येक एक वर्ग भी होना चाहिए? धन्यवाद।

+0

मैं वास्तव में एक उपयोगकर्ता और इस परिदृश्य में एक खाता के बीच का अंतर समझ में नहीं आता। क्या वे एक ही बात नहीं हैं? या उपयोगकर्ता लॉग इन व्यक्ति है, और खाते वे चीजें हैं जिन्हें वे एक्सेस करने का प्रयास कर रहे हैं? –

+0

उपयोगकर्ता सिर्फ व्यक्ति लॉग इन है। उपयोगकर्ता आईडी और पास webssver पर mysql में संग्रहीत है। कोई रजिस्ट्री नहीं - हम उपयोगकर्ताओं को स्थापित करते हैं और दूसरे डेटाबेस के लिए प्रमाण पत्र देते हैं। खाता जानकारी (दूसरा डेटाबेस) दूरस्थ सर्वर – bdscorvette

+0

पर sybase में संग्रहीत है ठीक है, यह समझ में आता है। मेरा काम इन दिनों कोडिंग से अधिक खाता प्रबंधन है, इसलिए मुझे एक ही चीज़ के रूप में "खाते" और "उपयोगकर्ता" के बारे में सोचना पड़ता है ;-)। –

उत्तर

2

सबसे पहले, दिमित्रि द्वारा अन्य जवाब पर एक माध्यमिक जवाब के रूप में:

चीजें आप एक सिंगलटन होने से प्राप्त करेंगे बातें आप कम करने के लिए पीला। आपको एक वैश्विक वस्तु मिलती है, जो आपके प्रोग्राम का हर भाग पढ़ और संशोधित कर सकता है, लेकिन आपने टेस्टेबिलिटी, पठनीयता और रखरखाव खो दी है।

क्योंकि सिंगलटन ऑब्जेक्ट वास्तव में वैश्विक है, इसलिए आप अपने आवेदन में एकल इकाइयों को सटीक रूप से अलग नहीं कर सकते हैं (जो यूनिट परीक्षण के लिए महत्वपूर्ण है), क्योंकि आपका फ़ंक्शन अन्य घटकों पर निर्भर है, जो इसमें "जादुई रूप से" डाले गए हैं।

आप पठनीयता खो क्योंकि method() वास्तव में अन्य बातों के (उदाहरण के लिए काम करने के लिए आवश्यकता हो सकती है, user वस्तु एक db उदाहरण की जरूरत है, इस new user($db) भी बहुत कुछ, new user() से पठनीय क्योंकि भले स्रोत कोड देख के बिना, मैं क्या बता सकते हैं बनाता है विधि/वस्तु को काम करने की आवश्यकता है।

आप ऊपर बताए गए कारणों के कारण रखरखाव खो देते हैं।यह कहना मुश्किल है कि सिंगलटन के माध्यम से कौन से घटक डाले जाते हैं, इसे फ़ंक्शन के "अनुबंध" में देखना है, इस कारण से, भविष्य में आप और/या किसी अन्य डेवलपर को आपके कोड को पढ़ने और पुन: सक्रिय करने के लिए कठिन होगा।


एक तरफ ध्यान दें के रूप में, यह माना जाता है अच्छा नामकरण परंपरा इसके पहले अक्षर ऊपरी मामलों, मैं अब से इस सम्मेलन का उपयोग किया जाएगा के साथ Class नाम नाम है।

चलिए शीर्ष से शुरू करते हैं। आप अपने Db वस्तु, MysqlDb, और SybaseDb के लिए 2 संभव राज्यों की है। यह बहुरूपता के लिए कहते हैं। आपके पास अमूर्त वर्ग Db, और दो कंक्रीट कक्षा MysqlDb और SybaseDb इससे विरासत में है। सही Db वस्तु की इन्स्टेन्शियशन एक कारखाने

class DbFactory { 

    private $db; 

    /** 
    * Create a new Db object base on Type, and pass parameters to it. 
    * 
    * @param string $type Type of database, Mysql or Sybase. 
    * @param string $dsn The DSN string corresponding to the type. 
    * @param string $user User credential 
    * @param string $pass Password credential 
    * 
    * @return Db 
    */ 

    public function create($type, $dsn, $user, $pass) { 
     if (!is_a($this->db, "Db")) { 
      $type  = $type . "Db"; 
      $this->db = new $type($dsn, $user, $pass); 
     } 

     return $this->db; 
    } 
} 

abstract class Db { 

    /** 
    * @param $dsn 
    * @param $user 
    * @param $pass 
    */ 
    public function __construct($dsn, $user, $pass) { 
     $this->db = new PDO("$dsn", $user, $pass); 
     $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     $this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
    } 
} 

class MysqlDb extends Db { 

    /* 
    * More specific, Mysql only implementation goes here 
    */ 
} 

class SybaseDb extends Db { 

    /* 
    * More specific, Sybase only implementation goes here 
    */ 
} 

अब आप अपने आप से पूछना चाहिए, जो खातों की सूची प्राप्त करने के लिए जिम्मेदार है की जिम्मेदारी है? निश्चित रूप से उन्हें खुद को नहीं लेना चाहिए (जितना अधिक उपयोगकर्ता डेटाबेस से अपना डेटा लाने की ज़िम्मेदारी नहीं है)। यह User केSybaseDb कनेक्शन का उपयोग कर इन खातों, लाने के लिए जिम्मेदारी है। - खाता सूची लाने के लिए

  • Sybase डेटाबेस कनेक्शन:

    वास्तव में, User काम करने के लिए निम्नलिखित की जरूरत है। हम DbFactory उदाहरण को पास करेंगे, ताकि अगर हम पहले से ही तत्काल हो चुके हैं, तो हम आसानी से इंस्टेंस प्राप्त कर सकते हैं, और यदि नहीं हो तो इसे तुरंत चालू करें।

  • राज्य जानकारी (स्थिति में लॉग इन, यूजर आईडी, उपयोगकर्ता नाम, आदि)।

User नहीं जिम्मेदार इस डेटा सेट करने के लिए, यह जरूरत यह काम करने के लिए है।

तो User निर्माता इस (यह मानते हुए "आईडी" और "नाम" फ़ील्ड) तरह दिखना चाहिए:

User::__construct($id, $name, DbFactory $factory); 

User एक क्षेत्र $accounts, जो Account वस्तुओं के सरणी पकड़ होता होगा। यह सरणी User::getAccounts() विधि के साथ पॉप्युलेट की जाएगी।

+0

धन्यवाद। बहुत सूचनाप्रद। मुझे लगता है कि मैं समझता हूं कि आप उनकी ज़िम्मेदारी के बारे में क्या कह रहे हैं और उन्हें क्या काम करने की ज़रूरत है। उपयोगकर्ता को उनके खाते मिलेंगे। खाते खुद नहीं मिलेंगे। लेकिन, निश्चित रूप से खाता भी एक वस्तु होना चाहिए? खातों में वित्तीय लेनदेन, इतिहास, नोट्स, चालान इत्यादि हैं। – bdscorvette

+0

दरअसल। उपयोगकर्ता ** ** '' accounts accounts 'प्रॉपर्टी रखेगा, जो ** खाता 'ऑब्जेक्ट्स ** की सरणी होगी। यह आपको आसानी से समाहित करने में मदद करेगा कि कौन सा खाता किस उपयोगकर्ता से संबंधित है। –

-1

मैं खाता उपयोगकर्ता का सदस्य खाता बनाउंगा। "उपयोगकर्ता में खाता है", है ना?

इसके अलावा, कक्षाओं के बारे में बोलते हुए, सुनिश्चित करें कि आपके दो डीबी सिंगलटन हैं, और उन्हें getInstance() के माध्यम से प्राप्त करें, __construct() नहीं।

+0

धन्यवाद। मुझे लगता है कि आईडी अधिक सटीक रूप से कहती है कि उपयोगकर्ता ** ** खातों की एक श्रृंखला तक पहुंच है।उदाहरण के लिए, व्यवस्थापक के पास प्रत्येक खाते तक पहुंच होती है जबकि ग्राहकों और कर्मचारियों (जैसे विक्रेता) की सीमित सीमा तक पहुंच होती है। अन्य डेटाबेस के लिए ये श्रेणियां या सीमाएं 'क्लाइंट कोड' द्वारा लागू की जाती हैं, इसे कॉल करने दें। मैं डीबी कक्षा का उदाहरण शामिल करने के लिए ओपी संपादित कर रहा हूं। कृपया मुझे समझने में सहायता करें कि मुझे getInstance() के साथ सिंगलटन में जाने से क्या लाभ होगा (मुझे लगता है कि मैं समझता हूं कि एक सिंगलटन क्या है, शायद नहीं) – bdscorvette

+0

आपको सिंगलटन के साथ कहीं भी अच्छा नहीं मिलेगा। मैं तुम्हें वह दे सकता हूँ। –

संबंधित मुद्दे