यह जब यह है और इसे बनाने वस्तु के लिए विशिष्टताओं को निर्धारित करने के लिए सबसे अच्छा है ऑब्जेक्ट के आपके विनिर्देश की तरह लगता है कि आपके द्वारा चुने गए पैटर्न से मेल नहीं खाता है।
आम तौर पर आपको खुद से पूछना चाहिए, "क्या मुझे केवल एक वस्तु (स्थिर) या एक से अधिक का एक उदाहरण होना चाहिए?"
इस विशेष उदाहरण के लिए (डेटाबेस से कनेक्ट और क्वेरी करें), डेटाबेस ऑब्जेक्ट के लिए तत्काल ऑब्जेक्ट होने पर सलाह नहीं दी जाती है जब तक कि आपको डेटाबेस/से अधिक कनेक्शन स्थापित करने की आवश्यकता न हो।
इस प्रकार आपके पास एक इंस्टेंट बनाम स्थैतिक वस्तु के लिए उपयोग-केस है। कॉन्फ़िगरेशन के आधार पर एकाधिक समवर्ती कनेक्शन डेटाबेस को अधिभारित कर सकते हैं और एकल निष्पादन में कनेक्शन कितनी बार बनाया जाता है।
तो इस बात के साथ कि ऑब्जेक्ट्स के आर्किटेक्चर में सहायता के लिए PHP के लिए कई ओओपी डिज़ाइन "पैटर्न" उपलब्ध हैं। अधिक सामान्य पैटर्न के माध्यम से अच्छी चलने के लिए http://www.slideshare.net/RobertGonzalez/object-oriented-design-patterns-for-php-presentation देखें।
एक काम उदाहरण http://ideone.com/6qxvqx
नोट के लिए मैं mysqli2 को mysqli नाम और क्वेरी को संभालने के लिए एक नकली वर्ग बनाया है और कनेक्शन और वस्तु निर्माण के लिए कुछ ट्रैकिंग गयी।
<?php
interface iDatabase
{
static public function execute();
public function instantiatedExecute();
}
abstract class database implements iDatabase
{
protected static $conn;
/**
* create an instance of database that uses the same connection across all instances
*/
final public function __construct()
{
self::connect();
}
/**
* Connect to a database if not already connected
*/
final protected static function connect()
{
if (null === self::$conn || false === (self::$conn instanceof mysqli)) {
self::$conn = new mysqli(/* DB info */);
//add error checking here...
}
return self::$conn;
}
/**
* query database connection
*/
final public function query($query)
{
return self::doQuery($query);
}
/**
* static query database connection
*/
final public static function doQuery($query)
{
//sanitize query here if desired
return self::connect()->query($query);
}
}
class example extends database
{
/**
* example specific static execution
*/
public static function execute($query)
{
self::doQuery($query);
}
/**
* example specific non-static execution
*/
public function instantiatedExecute($query)
{
$this->query($query);
}
}
स्थैतिक कीवर्ड के बिना स्थैतिक विधि को नियमित विधि में बनाना आसान नहीं होगा। –
'$ यह' स्थिर तरीकों में मौजूद नहीं है। जो भी आप चाहते हैं वह असंभव है, जब तक कि आप स्थिर विधि को कॉल करने वाले पैरामीटर के रूप में '$ this' की एक प्रति में पास न करें। –
मुझे इसे एक स्थिर विधि होने की आवश्यकता है क्योंकि मैं इसे बिना किसी उदाहरण के उपयोग करता हूं। – WhiteBlue