Dziedziczenie - czy jest lepsze rozwiązanie

0

Witam,
mam pewien problem. Posiadam klasę Baza, która łączy się z bazą danych MySQL oraz inne klasy, które żeby wykonać zapytanie, są zrobione jako klasy dziedziczące.

Plik Baza.php

<?
 class Baza {
    function connet(){
      // połączenie z bazą danych mysql
    }

    function sql(){
      // wysłanie zapytania (wraz ze sprawdzaniem błędów)
    }
 }
?>

Plik Kategorie.php

<?
 class Kategorie extends Baza{
    function get(){
      // pobiera dane z bazy przy użyciu **this->sql()**
    }

    ... // inne funkcje
 }
?>

Plik Produkty.php

<?
 class Produkty extends Baza{
    function get(){
      // pobiera dane z bazy przy użyciu **this->sql()**
    }


    ... // inne funkcje
 }
?>

W głównym pliku index.php robię tak:

<?
...
include("Baza.php");
include("Kategorie.php");
include("Produkty.php");
...
?>

Czy jest taka możliwość by każda klasa nie musiała dziedziczyć z głównej dla tej jednej funkcji? Lub żeby pobierała tylko tą funkcję? Oczywiście nie chcę też tworzyć za każdym razem na nowo tych funkcji.

Jak to zrobić?

W razie pytań proszę pisać, bo może cos być niejasne.

0

Ja bym wyciągnął funkcję łączenia z bazą z Twojej klazy Baza do osobnej klasy Singleton, i w konstruktorze klasy Baza przekazywałbym instancję połączenia. Jakoś tak:

 
protected $conn;
public function __construct(MyConn $conn) 	{
	$this->conn = $conn->db_connection;
}	

Singleton którego używam u siebie (przykład adoptowany z net'u, niestety nie pamiętam źródła, tak czy inaczej nie przypisuje sobie autorstwa):

 
class MyConn {
	private static $instance;	
	public static $connected = false;		// Determines if connection is established
	public $db_connection = null;        	// Database connection resource link
	private $db_server = null;            	// Database server
	private $db_database = null;          	// The database being connected to
	private $db_username = null;          	// The database username
	private $db_password = null;          	// The database password	         
	
	private function __construct($server, $database, $username, $password)
	{
		$this->db_server = $server;
		$this->db_database = $database;
		$this->db_username = $username;
		$this->db_password = $password;

		// Attempt connection
		try {
			// Create connection to MYSQL database			
			$this->db_connection = mysql_connect ($this->db_server, $this->db_username, $this->db_password);
			mysql_select_db ($this->db_database);			
			if (!$this->db_connection) {
				throw new Exception('MySQL Connection Database Error: ' . mysql_error());
			} else {
				self::$connected = true;
			}
		} catch (Exception $e) {
			echo $e->getMessage();
		}
	}
	
	public static function Connection($server, $database, $username, $password) {
		if(!isset(self::$instance) || self::$connected == false) {
			$c = __CLASS__;
			self::$instance = new $c($server, $database, $username, $password);
		} 
		return self::$instance;
	}
}

EDIT: Aha, a resztę (dziedziczenie) zostawiłbym tak jak zrobiłeś.

0

ja bym zrobil tak, ze bylaby klasa Baza, klasa kategorie, ktora pobiera (require) plik z klasa z Baza i na potrzeby klasy kategorie bym wewnatrz potrzebnej funkcji tworzyl obiekt Baza.

 class Base {
public function connect() { /** connecting */}
 };
class Category{
public function getCat()
{
	$base = new Base();
	$base -> connect();
}
};
0

Witam,
dzięki. Pierwszy przykład odpada, ponieważ nie chcę robić za każdym razem dziedziczenia. Choć drugi też ma wadę, więc możliwe że zostanę przy pierwszym.

Co do drugiego przykładu, jeżeli miałbym 20 funkcji to muszę 20 razy tworzyć nowy obiekt i teraz pytanie: Lepiej jest tworzyć wiele obiektów np: 10 plików po 20 funkcji = 200 obiektów, czy lepiej zostać przy dziedziczeniu? Chyba że jest jakaś inna możliwość usprawnienia tego? Jak robi się to w dużych CMS'ach?

Pozdrawiam

1

Jeśli dobrze rozumiem problem to PHP ma tką ciekawostkę że następujący kod zadziała:

 
 class X {
  public function showName() {
    echo $this->name;
  }
}

class Z {
  public function setAndShowName {
     $this->name = 'Z';
     X::showName();
  }
}
0

Dzięki wielkie to właśnie to !

Mam jeszcze jeden problem, ponieważ funkcja sql zawiera this->connect, więc krzyczy mi że nie zna funkcji np: Produkty->connect(), ale wrzucę to w jedną funkcję i będzie działać. Chyba że i na to jest jakiś kruczek... (będę szukał - chyba że znacie odpowiedź).

1 użytkowników online, w tym zalogowanych: 0, gości: 1