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?
oke stel ik maak er een abstracte class van. hoe roep ik hem dan steeds aan?

moet ik hem dan bijv in die interface laden of in de sql type class?

Een abstracte class kan je niet aanroepen, je kan er geen instantie van maken. Het enige wat een abstracte class kan, is de parent zijn voor andere classes. Als je dus de methodes in een abstracte class nodig hebt, dan moet je eerst zorgen dat je een instantie hebt van een descending class van die abstracte class. Via dat object kan je de functionaliteit in de abstracte class gebruiken.

<?php
abstract class Base_Class{
private $name;

public function setName( $value ){
$this->name = $value;
}

public function getName(){
return $this->name;
}
}
?>
Dit is een abstracte class. Hoewel de functies setName en getName public zijn, kan je er op die moment niets mee, want je geen instantie maken van deze class. Je kan dus niet doen:
<?php
//dit levert een foutmelding op
$obj = new Base_Class();
?>
Je kan wel een descending class maken:
<?php
class Persoon extends Base_Class{
private $age;

public function setAge( $value ){
$this->age = $value;
}

public function getAge(){
return $this->age;
}
}
?>
Omdat Persoon de Base_Class extend en zelf niet abstract is kan je nu ook de publieke functies van Base_Class aanroepen:
<?php
$obj = new Persoon();
$obj->setName( 'Erwin' );
echo $obj->getName();
?>

Overigens kan je ook niets 'in een interface laden'. Een interface definieert alleen (deels) hoe een class eruit moet zien. Verder kan je niets met een interface, je kan er ook geen instantie van maken. Een interface heeft ook nooit een implementatie.
ja en daar ligt bij mij dus juist het probleem wat ik niet snap. de interface die zegt als het ware hoe moet mijn sql class eruitzien voor elke type. maar die sql class moet deze databaseConfig dus ook extenden toch? want daar staat dan de informatie in die ik moet gebruiken de Superklasse wordt databaseConfig dan. hoe komt databaseConnect class er uit te zien dan?

is dit hieronder zo goed dan?

<?php
interface Connection_Interface
{
}

class databaseConnectMySql implements Connection_Interface extends databaseConfig
{
}

abstract class databaseConfig
{
private $hostname;
private $username;
private $pass;
private $database;
private $table;
private $connector;

function __construct($hostname = NULL, $username = NULL, $pass = NULL, $database = NULL, $prefix = NULL, $connector = NULL)
{
$this->hostname = !empty($hostname) ? $hostname : "";
$this->username = !empty($username) ? $username : "";
$this->pass = !empty($pass) ? $pass : "";
$this->database = !empty($database) ? $database : "";
$this->table = !empty($table) ? $table : "";
$this->connector = !empty($connector) ? $connector : ""; //mysql of mysqli waarde opgeven (database)
}

function __destruct()
{
#destruction!
}
}
?>
Hoe je het precies doet is natuurlijk helemaal aan jou. Als je die databaseConfig als super class gebruikt voor alle config objecten, dan moet databaseConnectMySQL die extenden inderdaad. Maar tevens die interface implementeren. Dat doet je superclass namelijk nog niet.

Op die manier heb je de functionaliteit uit de superclass al en je implementeert de interface waardoor andere objecten weten dat die class bepaalde functionaliteit biedt.

Overigens schrijf ik het altijd andersom:
class ... extends ... implements ...
Ik weet niet of dit verplicht is, maar zo is het duidelijker omdat je eerst de class hierarchie laat zien en dan wat het implementeert.
ja je moet idd extends implements ik kreeg foutmelding toen ik het andersom had :)

dan heb ik alleen nog een vraagje voor ik dit allemaal verder uit ga bouwen.

ik twijfel over dit stukje. en dan vooral het construct gedeelte en de code die ik erin aanroep. doe ik dit zo goed in deze klasse?
<?php
class databaseConnectMySql extends databaseConfig implements Connection_Interface
{
/**
* declareren van alle functies
*/
public $hostname;
public $username;
public $pass;
public $database;
public $table;
public $connector;

public function __construct($hostname, $username, $pass, $database, $table, $connector)
{
$this->databaseConfig = $databaseConfig;
}
}
?>
Nee, databaseConfig is niet een property in de Class en wordt ook niet meegegeven als parameter in de constructor.
Vraag is ook, wat wil je dat dat is? Want dit is toch je connector class? Dan moet je er geen connector meer aan mee geven natuurlijk.
true, dit is de connector class dus dan kan ik dat gewoon weglaten. oke, zou je even een kleine kritische blik willen werpen op de algehele code ( tis niet veel ) of ik het dan zo goed opgebouwd heb.

http://pastebin.com/mf7VUCn6
Erwin (en Reshad), dbConfig en dbConnect hebben toch een HEEFT_EEN relatie en niet een IS_EEN relatie? Die hele extend hoort daar toch niet? Je wilt toch zoiets doen:
Je gaat een beetje verkeerd met de properties en de constructor. De abstracte class neemt het setten van de properties al voor zijn rekening. In databaseConnectMySql hoef je dus niet nog een keer de constructor te definieren, zeker niet als je die leeg laat. Als je namelijk in beide een constructor hebt dan zal ALLEEN de constructor van de kind class worden aangeroepen. De constructor van de abstracte basis class dus niet! Je kan het wel handmatig doen door parent::__construct(....) aan te roepen, maar in dit geval is dat niet nodig omdat je verder toch niets doet.

Verder heb je in de abstracte class alle properties op private gezet. Op zich ben ik het daar mee eens (mening), maar je hebt ze wel nodig in databaseConnectMySql. Ofwel dan moet je getters en setters ervoor hebben zodat je ze aan kan roepen, ofwel je moet ze allemaal protected maken, dan kan je ze direct aanroepen.
Wat je in elk geval niet moet doen is ze nogmaals declareren in databaseConnectMySql. Dan heb je namelijk een private en een public property met dezelfde naam en dan durf ik niet te zeggen hoe dat gaat werken.
aah ik snap al waar je heen wilt wouter,

dan krijg ik dus zoiets?
<?php
class dbConfig
{
// hier alles declareren en gettenn
}

class dbConnect (dbConfig)
{
// hier alle methods
}

en dan

dbConnecMySQL extends dbConnect
{
}

?>

Reageren