2013-02-27 20 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. 
    } 
} 

chcę zrobić coś podobnego, ale nie mogę znaleźć sposób, który działa, nieruchomość musi statyczne ...Dostęp właściwość non-statyczne od statycznej metody

+2

Czy nie byłoby łatwiej zrobić metodę statyczną w zwykłą metodę bez słowa kluczowego static. –

+2

'$ this' nie istnieje w metodach statycznych. to, czego chcesz, jest niemożliwe, chyba że przekażesz kopię '$ this' jako parametr od miejsca, w którym wywołujesz metodę statyczną. –

+0

Potrzebuję tej metody statycznej, ponieważ używam jej bez instancji. – WhiteBlue

Odpowiedz

7

Nie można uzyskać dostępu niestatyczny właściwości z metod statycznych. Własności niestatyczne należą tylko do instancji obiektów, w których każdy instancjonowany obiekt ma oddzielną wartość właściwości.

będę zilustrować na przykładzie, ten kod nie działa:

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

podobnym stanowisku here

Jedynym sposobem, aby połączyć się z non-statycznej metody z metody statycznej jest mieć instancję klasy zawierającej metodę niestatyczną. Z definicji metoda niestatyczna to taka, która nazywa się instancją jakiejś klasy, podczas gdy metoda statyczna należy do samej klasy.

+0

Podobny post, ale inny język. Ta odnosi się do java; to jest php. – Pere

4

jak powiedział marko Nie można uzyskać dostępu do właściwości statycznych metodami statycznymi. jeśli to możliwe, zmień swoją nieruchomość na statyczną, a następnie zadziała twój kod.

Zrobiłem coś takiego ..

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


    } 

nadzieję, że ktoś pomaga :)

--cheers

0

Najlepiej jest określić specyfikacje dla obiektu podczas tworzenia go i brzmi, jak twoja specyfikacja obiektu nie pasuje do wybranego wzoru.

Generalnie powinieneś zadać sobie pytanie: "Czy muszę mieć tylko jedną instancję obiektu (statyczną) lub więcej niż jedną?"

Dla tej konkretnej instancji (połącz się z bazą danych i zapytaj o nią), posiadanie instancji obiektu dla obiektu bazy danych nie jest zalecane, chyba że musisz ustanowić wiele połączeń do bazy danych.

W ten sposób masz przypadek użycia dla obiektu instancji kontra statyczny. Wiele współbieżnych połączeń może spowodować przeciążenie bazy danych, w zależności od konfiguracji i liczby nawiązań połączenia w jednym wykonaniu.

Więc mając na uwadze, istnieje kilka "wzorców" projektowania OOP dostępnych dla architektury pomocnej w architekturze obiektu/ów. Zobacz http://www.slideshare.net/RobertGonzalez/object-oriented-design-patterns-for-php-presentation, aby zapoznać się z bardziej powszechnymi wzorami.

Dla przykładu roboczego http://ideone.com/6qxvqx

Note I przemianowany mysqli do mysqli2 i stworzył fałszywą klasę do obsługi zapytania i dodano kilka śledzenie celu utworzenia połączenia i obiektów.

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

Możesz uzyskać dostęp, tworząc instancję nowego obiektu ($self = new static;). Przykładowy kod:

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. 

    } 
} 
Powiązane problemy