[PHP5] 2 klasy - "połączenie"

0

Witam,
Mam "stronke" (system) którą wyświetla klasa main. Zawiera ona dużo metod, trzyma polaczenie z baza itd...
Chce teraz utworzyć drugą klasę która będzie odpowiedzialna za obsługę komentarzy zeby miec troche porządku. I teraz mam pytanie bo nie chciałbym w drugiej klasie znowu tworzyć połączenia z bazą tylko wykorzystac to z pierwszej klasy.
Wygląda to mniej więcej tak:

class main {

private conn=null;
private db = null;

function __construct(){
$this->db = &NewADOConnection('mysql');
$this->conn=$this->db->PConnect('host','user', 'haslo', 'baza');
}

}

Teraz chce utworzyc drugą klase ktora bedzie tworzona wewnatrz klasy main i chcialbym tam wykorzystac to polaczenie. Jak to zrobic najprosciej?
Jestem poczatkujacy wiec prosze o wyrozumialosc.
Chyba ze to jakos inaczej sie rozwiazuje.

Mowiac w skrocie wewnatrz klasy komentarz chcialbym sie odwolywac do $this->conn z klasy main.

0

Mógłbyś zrobić z conn pole publiczne, ale to naruszyłoby zasadę hermetyzacji, więc nie rób tego (każda zewnętrzna klasa mogłaby wtedy -- nawet przypadkowo -- zmienić main::conn na dowolną wartość). Możesz zrobić np. coś takiego:

W drugiej klasie (nazwijmy ją Druga) zrób sobie składnik prywatny conn. Rozumiem, że klasa ta zawsze wymaga do poprawnego działania połączenia z bazą danych. W takim razie w samym jej konstruktorze (funkcja __construct) możesz zadeklarować argument $conn. Klasa będzie po prostu oczekiwała, że ktoś, kto ją tworzy, poda jej jakieś połączenie. W konstruktorze Druga::__construct($conn) robisz $this->conn = $conn.

Teraz, gdy w konstruktorze klasy Main (zmienię pierwszą literę w nazwie na wielką, bo taka jest konwencja) będziesz sobie tworzył instancję klasy Druga, to rób to za kodem odpowiedzialnym za tworzenie połączenia z bazą. Zapewne będziesz chciał wstawić do Main składową np. o nazwie druga (małą literą), która będzie przechowywała obiekt klasy Druga (nazwa klasy wielką literą). Tworząc ten obiekt musisz przekazać mu za argument połączenie, którym dysponuje Main. Czyli cały kod Main::__construct byłby jakoś taki:

function __construct(){
    $this->db =  &NewADOConnection('mysql');
    $this->conn=$this->db->PConnect('host','user', 'haslo', 'baza');
    $this->druga = new Druga($this->conn);
}

W ten sposób zarówno klasa Main, jak i klasa Druga ma swoją składową conn. I w obu odnosisz się do połączenia pisząc po prostu $this->conn.

Są jeszcze inne metody niż przekazywanie conn poprzez argument konstruktora. Np. w Main mógłbyś mieć metodę getConnection(), która zwracałaby połączenie. Jeśli metoda nie byłaby statyczna, to klasa Druga mogłaby przyjmować za argument obiekt klasy Main i stamtąd sama wyciągałaby sobie połączenie. Albo w ogóle możesz zrobić oddzielną klasę odpowiedzialną za nawiązywanie połączenia.

Klasy generalnie nie powinny być duże. I nie powinno się ich nazywać ogólnie, tak jak Main :). Tzn. bardzo wiele stron ma w końcu jakąś klasę Utilities czy Main, ale trzeba uważać żeby nie było tak, że te klasy to worki do których można wszystko wrzucać.

0

A ja to robię tak:

<?php
class CommentClass{
	var $Date;
	public function __construct(&$Main) {
		$this->Date['Main'] = &$Main;
	}
	public Save(){
		$this->Date['Main']->db; //twoje połaczenie
	}
}

class Main{
var $Date = array();
	function __construct(){
		$this->db =  MySQLConnect();
	}
	
	public &Comment(){
		if(empty($this->Date['CommentClass'])){
		//include_once("CommentClass.php"); - jak masz klase w pliku
			$this->Date['CommentClass'] = new CommentClass($this)
		}
		return $this->Date['CommentClass'];
	}

}
$Test = new Main;
$Test->Comment()->Save();
?>

Jak natomiast w klasie nie chcesz deklarować twoich klas, to zamień funkcję Comment na

	public &Load($ClassName){
		if(empty($this->Date[$ClassName])){
			$this->Date[$ClassName] = new $ClassName($this)
		}
		return $this->Date[$ClassName];
	}

I używaj ją:

$Test = new Main;
$Test->Load("CommentClass")->Save();

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