2013-02-27 31 views
8
class database{ 
    protected $db; 

    protected function connect(){ 
     $this->db = new mysqli(/* DB info */); // Connecting to a database 
    } 
} 

class example extends database{ 
    public function __construct(){ 
     $this->connect(); 
    } 

    public static function doQuery(){ 
     $query = $this->db->query("theQuery"); // Not working. 
     $query = self::$db->query("theQuery"); // Not working. 
     $query = parent::$db->query("theQuery"); // Also not working. 
    } 
} 

मैं ऐसा ही कुछ करना चाहता हूँ, लेकिन मैं एक तरीका है कि काम करता है, संपत्ति स्थिर करने के लिए है लगता है नहीं कर सकते से एक गैर स्थिर संपत्ति ...पहुँच एक स्थिर विधि

+2

स्थैतिक कीवर्ड के बिना स्थैतिक विधि को नियमित विधि में बनाना आसान नहीं होगा। –

+2

'$ यह' स्थिर तरीकों में मौजूद नहीं है। जो भी आप चाहते हैं वह असंभव है, जब तक कि आप स्थिर विधि को कॉल करने वाले पैरामीटर के रूप में '$ this' की एक प्रति में पास न करें। –

+0

मुझे इसे एक स्थिर विधि होने की आवश्यकता है क्योंकि मैं इसे बिना किसी उदाहरण के उपयोग करता हूं। – WhiteBlue

उत्तर

7

आप गैर स्थिर उपयोग नहीं कर सकते स्थिर तरीकों से गुण। गैर स्थैतिक गुण केवल तत्काल वस्तुओं से संबंधित होते हैं, जहां प्रत्येक तत्काल वस्तु के पास एक अलग संपत्ति मूल्य होता है।

मैं एक उदाहरण पर उदाहरण देकर स्पष्ट करना होगा, इस कोड काम नहीं करता:

class Example { 
    public $a; 

    public __construct($a) { 
     $this->a = $a; 
    } 
    public static getA() { 
     return $this->a; 
    } 
} 

$first = new Example(3); 
$second = new Example(4); 

// is $value equal to 3 or 4? 
$value = Example::getA(); 
0

इसी पद here

एक ही तरीका है एक स्थिर विधि से एक गैर स्थैतिक विधि कॉल करने के लिए है गैर-स्थैतिक विधि वाले वर्ग का एक उदाहरण है। परिभाषा के अनुसार, एक गैर स्थैतिक विधि वह है जिसे किसी वर्ग के उदाहरण पर बुलाया जाता है, जबकि एक स्थिर विधि वर्ग से संबंधित होती है।

+0

इसी तरह की पोस्ट लेकिन अलग भाषा। वह जावा को संदर्भित करता है; यह PHP है। – Pere

4

मार्को ने कहा कि आप स्थैतिक तरीकों से गैर स्थैतिक गुणों तक नहीं पहुंच सकते हैं। यदि संभव हो तो अपनी संपत्ति को स्थिर में बदलें और फिर आपका कोड काम करता है।

मैं कुछ इस तरह किया था ..

class Member_DashBoard extends Page { 

    public static $lapsed_id = 4; //Membership lapsed status id 


    //calling static function by passing static property 
    $status_custom = self::getMembershipStatusLapsed(self::$lapsed_id);// 
       $status_custom_id = $status_custom['id']; 



     public static function getMembershipStatusLapsed($membershipStatusId) { 

     $statusDetails = array(); 
     $membershipStatus = new Core_MembershipStatus(); 
     $membershipStatus->id = $membershipStatusId; 
     if ($membershipStatus->find(TRUE)) { 
      Core_DAO::storeValues($membershipStatus, $statusDetails); 
     } 

     return $statusDetails; 
     } 


    } 

आशा है कि यह मदद करता है किसी को :)

--cheers

0

यह जब यह है और इसे बनाने वस्तु के लिए विशिष्टताओं को निर्धारित करने के लिए सबसे अच्छा है ऑब्जेक्ट के आपके विनिर्देश की तरह लगता है कि आपके द्वारा चुने गए पैटर्न से मेल नहीं खाता है।

आम तौर पर आपको खुद से पूछना चाहिए, "क्या मुझे केवल एक वस्तु (स्थिर) या एक से अधिक का एक उदाहरण होना चाहिए?"

इस विशेष उदाहरण के लिए (डेटाबेस से कनेक्ट और क्वेरी करें), डेटाबेस ऑब्जेक्ट के लिए तत्काल ऑब्जेक्ट होने पर सलाह नहीं दी जाती है जब तक कि आपको डेटाबेस/से अधिक कनेक्शन स्थापित करने की आवश्यकता न हो।

इस प्रकार आपके पास एक इंस्टेंट बनाम स्थैतिक वस्तु के लिए उपयोग-केस है। कॉन्फ़िगरेशन के आधार पर एकाधिक समवर्ती कनेक्शन डेटाबेस को अधिभारित कर सकते हैं और एकल निष्पादन में कनेक्शन कितनी बार बनाया जाता है।

तो इस बात के साथ कि ऑब्जेक्ट्स के आर्किटेक्चर में सहायता के लिए 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); 
    } 
} 
5

आप नई ऑब्जेक्ट को तुरंत चालू कर सकते हैं ($self = new static;)। नमूना कोड:

class database{ 

    protected $db; 

    protected function connect(){ 
     $this->db = new mysqli(/* DB info */); // Connecting to a database 
    } 
} 


class example extends database{ 

    public function __construct(){ 
     $this->connect(); 
    } 

    public static function doQuery(){ 

     $self = new static; //OBJECT INTANTIATION 
     $query = $self->db->query("theQuery"); // working. 

    } 
}