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 maakt een instance van dbConfig aan. Hierin sla je de settings op:
<?php
$config = new DbConfig('localhost', 'user', 'pass', 'dbname');
?>
Hoe roep je nu bijv. de user op? Dat doe je toch met:
<?php
echo $config->getUser();
?>
Nu laad je de klasse dbConfig in als een variabele in een dbConnect klasse:
<?php
$connect = new DbConnectMySQL($config);
?>
In de constructor van DbConnect plaats je dan deze config in de property $this->config.
Vervolgens heb je in een method DbConnectMySQL::openConnection() de waarde van die DbConfig nodig. Hou pak je ze dan? Nou gewoon op dezelfde manier hoe je dat in het echt doet:
<?php
class DbConnectMySQL extends DbConnect
{
public function openConnection()
{
// de DbConfig klasse zit in $this->config
$this->config->getUser();
}
}
?>
Of als je dat makkelijker te begrijpen vind:
<?php
class DbConnectMySQL extends DbConnect
{
public function openConnection()
{
// de DbConfig klasse zit in $this->config
$config = $this->config;
$config->getUser();
}
}
?>
<?php
public function __construct($database, $dbConnect)
{
$this->dbConnect = $dbConnect;
}
?>
dbConnectMySQL extend dbConnect, dus je moet geen dbConnect meer meegeven. Alle functionaliteit is beschikbaar door het extenden (alleen private properties en methodes kan je niet aanroepen).
Verder moet je nog wel de __construct van de parent aanroepen als je die in dbConnectMySQL overschrijft, anders wordt die functie niet uitgevoerd:
<?php
public function __construct( $dbConfig )
{
parent::__construct( $dbConfig );
}
?>
Heb je overigens niets nieuws in de __construct dan kan je die weglaten, dan wordt automatisch de __construct van de parent aangeroepen.
Als je de gegevens van de dbConfig wilt aanroepen dan kan dat via
<?php
$this->dbConfig->getHost();
?>
dbConfig is namelijk in dbConnect als protected opgegeven, dus daar kan je bij.
Ik zie wat je bedoelt, volgens mij maakt Wouter een foutje in zijn voorbeeld en moet
<?php
class DbConfigMySQL extends DbConfig
?>
zijn
<?php
class DbConnectMySQL extends DbConnect
?>
Maar aan Wouter voor het antwoord :-)
Waar worden de $this->host en $this->username properties dan geset? Nergens toch? Lees eens Erwin's en mijn reactie, want daar heb je nog niet heel veel van opgestoken...
Ja, maar niet in de dbConnect klassen toch? Let op dat die properties per klasse verschillen. Elke propertie hangt per instance (dus per aanmaak) van een klasse af. Per aanmaak moet je deze opnieuw instellen met de waardes die jij wilt.
Als je dus in Klasse A een property set kun je die in Klasse B niet gebruiken. Daarvoor moet je die in Klasse B eerst opslaan.
Nu sla je Klasse A op in een property van Klasse B. Het enige wat je dus moet doen is naar de property gaan waarin Klasse A zit en dan met methods van Klasse A de waardes verkrijgen.
DbConfig en DbConnect zijn 2 totaal verschillende klassen en 2 totaal verschillende scopes. Het enige wat je doet is dat je een instance van Dbconfig inlaad in een property van DbConnect.