oke na uitstekende hulp zoals altijd hier van onder andere Wouter en Erwin heb ik maar even geprobeerd om zonder tutorials etc een class te bouwen. (wel kijken naar de linkjes van wouter) want het was idd nog een beetje kopieren en plakken met OOP maar ik ben nu wel op de goede weg denk ik. heb begin gemaakt met een class 'databaseConfig' hier staat de database configuratie in. dan heb ik vervolgens een class gemaakt genaamd 'databaseConnect' hier ga ik connecten met de database. maar nu. snap ik een paar dingen niet.
wat is het verschil tussen
abstract class ...
en
class ...
en moet ik nu de databaseConnect extenden uit de databaseConfig of moet ik hier de __construct gebruiken zoals __construct(databaseConfig)? of denk ik nu helemaal verkeerd?
Je moet nog eens heel goed kijken naar hoe het zit met overerving (het extenden van classes). Zoals je het nu doet is het niet goed. Je abstracte class is op deze manier overbodig.
Het idee van overerving is dat je bepaalde functionaliteit al inbouwt in de basis class (bij jou dbConnect) zodat die in alle afgeleide classes automatisch beschikbaar komt. Je overschrijft nu echter alles weer in dbConnectMySQL waardoor je hele basis class niets meer toevoegt. Nog los van het feit dat je niet bestaande properties niet kunt returnen (wat je nu doet in dbConnect).
Een ander punt is dat je de dbConfig helemaal niet gebruikt. Het idee is dat je die meegeeft aan een connectie class en dat de connectie class de gegevens eruit haalt wanneer het nodig is. Je constructor van dbConnectMySQL neemt nu echter all gegevens als parameters op en slaat het dan weer op in private properties. Zo gebruik je die hele dbConfig dus niet.
<?php
abstract class dbConfig
{
protected $type = false;
public function __construct($dbType)
{
$this->type = $dbType;
}
public abstract function getHost();
public abstract function getName();
public abstract function getPass();
public abstract function getDatabase();
function __destruct()
{
#destruction!
}
}
?>
dan kan ik toch dbConnect weglaten en in elke child die dingen aanroepen toch? want meerdere childs kunnen dan die dbConfig aanroepen om connectie te maken.
bij
<?php
class dbConnectMySQL extends dbConfig
{
}
class dbConnectOracle extends dbConfig
{
}
?>
of.. moet ik dbConnect erin laten hier de connectie verwerken en deze dan laten extenden.. maar hoe zou dbConnect eruit moeten zien dan?
dbConfig is nu abstract, dus kan je die niet meer gebruiken, tenzij je er een afgeleide class van maakt. Maar dat moet je dus niet doen, want zoals gezegd, dbConnect (en zijn afgeleiden) is een andere entiteit dan dbConfig. Die twee hebben elkaar nodig, maar zijn niet hetzelfde.
Of je dbConnect weg kan laten is onafhankelijk van wat je met dbConfig doet.
Op de vraag of dat kan (dbConnect weglaten), op zich wel. Wat je altijd moet afvragen bij het maken (of niet) van een superclass is of je enige functionaliteit hebt dat gedeeld zal worden door alle afgeleide classes. Qua hoe elke afgeleide class de connectie maakt met de database heb je mogelijk gelijk dat dat niet altijd hetzelfde is. Wat je echter in elk geval deelt, is het inladen van de configuratie. Zelfs als dbConnect alleen de toegang tot het dbConfig object regelt, dan heb je al een functionaliteit die alle afgeleide classes zullen delen en dus heeft dbConnect recht van bestaan.
oke stel ik heb dan die dbConfig. en dbConnect ik zorg ervoor dat dbConnect alles afhandelt wat er in dbConfig als abstract meegegeven wordt. volgens mij krijg ik dan zoiets
Maar dat kan niet.....
Aangezien dbConnect geen afgeleide class is van dbConfig, kan dbConnect geen abstracte methodes uit dbConfig aanroepen.....
dbConfig moet een normale class zijn (dus NIET abstract) en mag GEEN abstracte methodes hebben. Heeft dbConfig dat wel dan is de class niet bruikbaar voor dbConnect.
Ja, met een kleine opmerking dat je wel alle properties gedefinieerd moet hebben, anders kan je ze ook niet returnen (return $this->username; terwijl hostname niet is gedefinieerd).
De class dbConnect zou ik dan wel abstract maken, want die wil je nooit als zodanig gebruiken, maar altijd een van de afgeleide classes ervan. Verder is dit een begin inderdaad. Dit kan je dus bijna in beton gieten :-)
en dan vooral: $this->dbConnect = mysql_connect($this->host, $this->username, $this->password);
is dit goed zo of moet het $this->dbConnect->host, etcc
en dien ik hier ook weer dingen te defineren die ge-extend worden? nee toch want de properties neemt ie mee. maar als foutmelding krijg ik nu met dit: $this->dbConnect = mysql_connect($this->host, $this->username, $this->password);
undefined property, maar wanneer ik er dbConnect in gebruik krijg ik Trying to get property of non-object wat dus wijst op een query die niet goed is volgens mij.. kan je hier wat meer uitleg over geven a.u.b? :)