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);
}
}
Czy nie byłoby łatwiej zrobić metodę statyczną w zwykłą metodę bez słowa kluczowego static. –
'$ 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ą. –
Potrzebuję tej metody statycznej, ponieważ używam jej bez instancji. – WhiteBlue