OOP syntaxen en werkingen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 4 volgende »

Reshad F

Reshad F

11/06/2012 15:29:41
Quote Anchor link
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?
 
PHP hulp

PHP hulp

29/03/2024 14:55:36
 
Erwin H

Erwin H

11/06/2012 15:41:09
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
//dit levert een foutmelding op
$obj = new Base_Class();
?>

Je kan wel een descending class maken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?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.
 
Reshad F

Reshad F

11/06/2012 16:11:22
Quote Anchor link
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?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?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!
    }
}

?>
Gewijzigd op 11/06/2012 16:12:12 door Reshad F
 
Erwin H

Erwin H

11/06/2012 16:22:51
Quote Anchor link
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.
 
Reshad F

Reshad F

11/06/2012 16:40:56
Quote Anchor link
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?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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;
    }
}

?>
Gewijzigd op 11/06/2012 16:42:24 door Reshad F
 
Erwin H

Erwin H

11/06/2012 16:47:15
Quote Anchor link
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.
 
Reshad F

Reshad F

11/06/2012 16:50:22
Quote Anchor link
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
 
Wouter J

Wouter J

11/06/2012 16:58:38
Quote Anchor link
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:
Afbeelding
 
Erwin H

Erwin H

11/06/2012 17:02:32
Quote Anchor link
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.
 
Reshad F

Reshad F

11/06/2012 17:04:40
Quote Anchor link
aah ik snap al waar je heen wilt wouter,

dan krijg ik dus zoiets?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class dbConfig
{
// hier alles declareren en gettenn
}

class dbConnect (dbConfig)
{

// hier alle methods
}

en dan

dbConnecMySQL extends dbConnect
{
}


?>
 
Erwin H

Erwin H

11/06/2012 17:05:03
Quote Anchor link
Wouter J op 11/06/2012 16:58:38:
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:

Volgens mij ligt dat een beetje in het midden. Zoals het nu is opgebouwd is de abstracte basis class precies dat; een basis class voor alle connector objecten. Daar kan ik mee leven. Daarna heb je nog een class nodig die de database functionaliteit beschikbaar maakt voor de applicatie. Die class zal een HEEFT_EEN relatie hebben met de connectie classes.



Toevoeging op 11/06/2012 17:08:01:

Hmm, volgens mij loopt het een beetje door elkaar door de naamgeving. Volgens mij de vertaling tussen Reshad's classes en de namen van Wouter:
databaseConfig (abstract) - dbConnect
databaseConnectMySql - dbConnectMySQL
..... - dbConfig

Naamgeving loopt volgens mij dus niet helemaal 1-op-1, maar het idee wel.
Of ben ik nu degene die de weg kwijt is :-)
Gewijzigd op 11/06/2012 17:09:05 door Erwin H
 
Reshad F

Reshad F

11/06/2012 17:10:23
Quote Anchor link
ik zal wel even met een schoon blad beginnen met de benamingen van wouter want het is nu een beetje een rommeltje maar dat maakt niet uit het hoeft niet te werken nu nog het is alleen maar die logica erin stampen :) dus ik ga het weer even helemaal opnieuw opbouwen zoals wouters schema. dat is wel heel duidelijk zo. ik post het hier zo wel ff :)

en jongens bedankt voor de tijd en moeite ik waardeer het enorm!
 
Wouter J

Wouter J

11/06/2012 17:19:05
Quote Anchor link
Erwin, mijn plan was:
1 klasse waarin db settings worden opgeslagen (zoals username, password, host, database, prefix, ect.) = dbConfig, en 1 set van klassen die de connection regelt met een mooi adapter pattern = dbConnect en de hele reeks erachteraan.
 
Erwin H

Erwin H

11/06/2012 17:27:16
Quote Anchor link
Ik denk dat ik je inderdaad op dat punt niet begrepen heb. Ik had geen aparte class in mijn hoofd voor alleen de configuratie gegevens.

Het connect gedeelte deelde ik wel, maar daar bovenop een facade zo je wilt die met een simpele functie een complete query kan draaien. Dit is wat ik zelf namelijk heb en daar lees je dan al snel naartoe natuurlijk. Dus het extra object dat je aangaf zag ik als die facade, niet als het config object. Alleen is dan de HEEFT_EEN relatie omgedraaid.
 
Reshad F

Reshad F

11/06/2012 17:34:04
Quote Anchor link
oke ik denk datik nu wel heel dichtbij de juiste opbouw kom. hier is die: http://pastebin.com/p3FnfKRf
 
Wouter J

Wouter J

11/06/2012 17:38:31
Quote Anchor link
Half, er zitten namelijk nog wat methoden in die abstract horen te zijn en dus ook wat klassen die abstract moeten zijn.
 
Reshad F

Reshad F

11/06/2012 17:44:35
Quote Anchor link
bedoel je dat dbConnect ook abstract moet zijn?
 
Wouter J

Wouter J

11/06/2012 17:52:51
Quote Anchor link
Je mag zelf bedenken welke klassen hier nou niet aangemaakt mag worden, omdat hij niet echt bestaat en welke methoden hier abstract, en dus doorgegeven moeten worden aan de children, zijn. Eigenlijk heb ik je al veel voorgezegd, dus ga zelf maar eens aan de slag!
 
Reshad F

Reshad F

12/06/2012 12:25:27
Quote Anchor link
oke ik heb het een en ander erin verwerkt gewijzigd en aangemaakt. volgens mij is hij nu wel goed.

ik heb het zelfs getest en ik krijg gewoon rijen etc uit de database terug en hij werkt zelfs!

alleen nu mijn vraag. is het een beetje OO http://pastebin.com/zgShuEjV
 
Wouter J

Wouter J

12/06/2012 13:46:47
Quote Anchor link
Nee, je hebt het nog steeds niet door. Wat je wilt is dat je 1 klasse hebt waarin je de instellingen opslaat (dbConfig) en 1 klasse waarin je de connectie aanmaakt (dbConnect). De dbConfig geef je mee aan de dbConnect constructor waardoor je in de dbConnect klassen gewoon $this->config->user kan gebruiken om iets op te halen of $this->config->pass.
Want waar denk je dat je die dbConfig klasse nu voor gebruikt? En waarom denk je dat hij abstract moet zijn?

Tevens moet je dubbele code weglaten en plaatsen in de superklasse. Stel je maakt er nog een adapter bij dan heb je hier nog code in staan die dubbel is en dus niet per adapter verschilt. Plaats die dan in de abstracte dbConnect klasse, zodat alle subklassen (dus alle adapters) deze automatisch al krijgen.

En waarom definieer je methods in de superklasse dbConfig en maak je die vervolgens na in de dbConfigMySQL klasse? Als je niet weet hoe je een method moet invullen, omdat deze verschilt voor alle subklassen moet je hem abstract maken en laten invullen door de subklassen.
Gewijzigd op 12/06/2012 13:48:06 door Wouter J
 

Pagina: « vorige 1 2 3 4 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.