webForumDet fria alternativet

Komma åt konstanter i arv

PHPur PHP

10 svar · 720 visningar · startad av oskob

Medlem sedan maj 20021 558 inlägg
Frågan#1

Hallå!

Jag har en superklass som alla mina underklasser ärver från. Denna klass har en funktion som laddar lite data från en tabell som är olika för varje ärvd klass. Såhär:

class Parent {

	const TABLE = '';

	function load() {
	
		$sql = "SELECT * FROM ".self::TABLE;
		
		...
	
	}

}

class Child extends Parent {

	const TABLE = 'minTabell';
	
	...

}

$o = new Child;
$o->load();

Men den förstår inte att det är TABLE i Child som ska användas och inte i Parent. Hur gör jag för att den ska förstå det?

Tack på förhand!

Medlem sedan okt. 2000149 inlägg
#2

Beror på att man inte kan skriva över (overload) en konstant i en barnklass.
Detta eftersom konstanten redan är definerad och en konstant är per defintion inte omdefinerbar.

Så mitt tips är att använda vanliga variabler.

Medlem sedan maj 20021 558 inlägg
#3

Men det är ju i olika klasser. Egentligen behöver inte TABLE finnas i Parent men den ger mig fel om den inte finns. Tänkte om man kunde ange att metoden bara får användas av klasser som ärver av denna klass och inte direkt genom Parent. Parent är en abstract class så jag trodde den skulle förstå detta men icke...

Medlem sedan maj 20021 558 inlägg
#4

Om man gör som så istället att man döper tabellerna till samma som klassen då. Hur kollar jag namnet på klassen genom en statisk metod?

Typ:

Child {
	public static function getClassName(){
		return get_class(self); // ska returnera "Child"
	}
}
Medlem sedan feb. 200777 inlägg
#5

....

Du borde göra en "databas-interaktions-klass" som gör alla kopplingar till databasen och som alla andra klasser gå via när de kommunicerar med när de vill komma åt databasen. Det blir enklare på det viset.

Medlem sedan maj 20021 558 inlägg
#6

Det är precis vad jag gör... Tror jag...
Jag ahr fått Parent att skapa INSER och UPDATE-satser utifrån variabler med tabellnamn och fält. Men när jag ska ladda ett objekt från tabellen så görst detta genom en statisk metod och då kommer jag inte åt dessa variabler.

Såhär ser det ut när jag skapar ett objekt:

abstract class Parent {
	loadById($id){
		$sql = "select serialstr from " . [Namnet på klassen] . " where id = $id";
		$str = query bla bla...
		
		return unserialize($str);
	}
}

$obj = Child::loadById(3);
Medlem sedan feb. 200777 inlägg
#7

....

Jag skulle strunta i de statiska metoderna eftersom de bara krånglar till det. Basklassen som alla andra ärver ifrån skulle ha gemensamma metoder för alla klasser såsom "createheader" och "createfooter" men inte databasanslutning för den är förmodligen inte gemensam för alla klasser. Det skulle finnas en fristående databasanslutningsklass, jag har även för mig att det är det som är vanligast förekommande när man pratar om "god design".

Eftersom jag knappast kan kalla mig php expert så vore jag intresserad av att höra vad andra har att säga om detta?

Medlem sedan maj 20021 558 inlägg
#8

Ja jag har givetvis en egen klass som utför själva databasanropen men jag har ett gäng (kanske 4-5 st) klasser som ser exakt likadana ut bara att kolumner och tabeller heter olika. Men jag löste det genom att i Child göra en metod som anropar den i Parent såhär:

static function loadById($id) {
return parent::loadById($id, self::TABLE);
}

Tack ändå!

Medlem sedan feb. 200777 inlägg
#9

......

Att ha en drös med klasser som ärver och det enda som skiljer sig i dem är tabell och kolllumn-namn verkar inte bra. Du borde istället ha en funktion som kan ta kollumn- och tabell-namn som inparametrar och producerar tabellerna som du vill ha.

Medlem sedan maj 20021 558 inlägg
#10

Exakt så jag gör. Funktionaliteten skiljer seg väldigt mycket mellan klasserna, men de har alla gemensamt att deras medlemsvariabler sparas i en databas. Denna biten vill jag ska skötas automatiskt. Vilket den gör nu med nödlösningen att göra en metod i child-klassen som anropar Parent-klassen så att den får med sig rätt tabellnamn.

Medlem sedan maj 20021 558 inlägg
#11

Just for the record hittade jag tillslut en lösning på att få get_class() att returnera namnet på klassen genom vilken metoden anropades och inte där den deklarerades:

Late Static Bindings:
http://se2.php.net/manual/en/language.oop5.late-static-bindings.php

131 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)