OOP syntaxen en werkingen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 4 volgende »

Erwin H

Erwin H

12/06/2012 13:50:06
Quote Anchor link
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 hulp

PHP hulp

23/11/2024 15:55:48
 
Reshad F

Reshad F

12/06/2012 14:56:14
Quote Anchor link
ja ik kom er niet helemaal uit met de dbConnect. aangezien. elke database een eigen manier van connecten heeft.. toch?

dus zou die er niet eerder uitgeknikkert moeten worden? of wat hoort daar voor functie er in

ik heb nu

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
35
36
37
38
39
40
41
42
<?php
class dbConfig
{
    protected $host = false;
    protected $name = false;
    protected $pass = false;
    protected $database = false;

    function
__construct($hostname, $username, $pass)
    {

        $this->host = $host;
        $this->name = $name;
        $this->pass = $pass;
        $this->database = $database;
    }

    
    public function getHost()
    {

        return $this->host;
    }


    public function getName()
    {

        return $this->name;
    }


    public function getPass()
    {

        return $this->pass;
    }


    public function getDatabase()
    {

        return $this->database;
    }
    
    function
__destruct()
    {

        #destruction!
    }
}

?>


en dan dbConnect extends.. dbConfig..
dbConnectMySQL extends dbConnect

kan dit?
 
Erwin H

Erwin H

12/06/2012 15:00:04
Quote Anchor link
Nee, dbConnect moet niet dbConfig extenden. Dat zijn twee verschillende entiteiten. Een dbConnect heeft een dbConfig nodig, maar het is er niet een.
 
Reshad F

Reshad F

12/06/2012 15:10:55
Quote Anchor link
oke, maar stel ik doe van dbConfig dit

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
<?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

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?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?
Gewijzigd op 12/06/2012 15:12:17 door Reshad F
 
Erwin H

Erwin H

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

Reshad F

12/06/2012 15:41:33
Quote Anchor link
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

-
Gewijzigd op 12/06/2012 16:10:56 door Reshad F
 
Erwin H

Erwin H

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

Reshad F

12/06/2012 16:37:21
Quote Anchor link
maar dan is dbConfig zo dus goed?

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
<?php
class dbConfig
{
    protected $type = false;


    public function __construct($dbType)
    {

        $this->type = $dbType;
    }

    
    public function getHost()
    {

        return $this->host;
    }


    public function getUsername()
    {

        return $this->username;
    }


    public function getPassword()
    {

        return $this->password;
    }
    
    function
__destruct()
    {

        #destruction!
    }
}

?>


maar hoe komt dbConnect eruit tezien dan zoiets?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
class dbConnect
{
    protected $dbConfig;

    public function __construct($dbConfig)
    {

        $this->dbConfig = $dbConfig;
    }

}

?>
 
Erwin H

Erwin H

12/06/2012 16:50:59
Quote Anchor link
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 :-)
 
Reshad F

Reshad F

12/06/2012 17:20:32
Quote Anchor link
oke ik heb alles gedefined was ik vergeten idd ^^ en de dbConnect abstract gemaakt.

nu hetgeen waar ik dus niet uitkomt dit stukjee

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
<?php
class dbConnectMySQL extends dbConnect
{
    private $database;
    public $startQuery;
    public $getResults;

    public function __construct($database, $dbConnect)
    {

        $this->dbConnect = $dbConnect;
    }


    public function openConnection()
    {

        try
                {
                    $this->dbConnect = mysql_connect($this->host, $this->username, $this->password);
                    $this->dbConnect = mysql_select_db($this->database);
                }

                catch (Exception $e)
                {

                        return $e;
                }
    }
}

?>


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? :)
 
Wouter J

Wouter J

12/06/2012 17:27:03
Quote Anchor link
Reshad, wat je doet is alsvolgt:

Je maakt een instance van dbConfig aan. Hierin sla je de settings op:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$config
= new DbConfig('localhost', 'user', 'pass', 'dbname');
?>

Hoe roep je nu bijv. de user op? Dat doe je toch met:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo $config->getUser();
?>


Nu laad je de klasse dbConfig in als een variabele in een dbConnect klasse:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
class DbConnectMySQL extends DbConnect
{
    public function openConnection()
    {

        // de DbConfig klasse zit in $this->config
        $config = $this->config;
        $config->getUser();
    }
}

?>
Gewijzigd op 12/06/2012 19:31:15 door Wouter J
 
Erwin H

Erwin H

12/06/2012 17:27:46
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?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
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$this
->dbConfig->getHost();
?>

dbConfig is namelijk in dbConnect als protected opgegeven, dus daar kan je bij.
Gewijzigd op 12/06/2012 17:28:07 door Erwin H
 
Reshad F

Reshad F

12/06/2012 18:01:54
Quote Anchor link
uhmm oke wat ik dus niet begrijp moet ik nu dbConfig extenden of dbConnect want ik krijg 2 verschillende opmerkingen.

bij extenden van dbConfig krijg ik geen foutmeldingen maar ook geen rijen terug
en bij dbConnect ook geen rijen maar ook dit erbij:

Notice: Undefined property: dbConnectMySQL::$host in /Applications/MAMP/htdocs/library/db.class.php on line 63

Notice: Undefined property: dbConnectMySQL::$username in /Applications/MAMP/htdocs/library/db.class.php on line 63

Notice: Undefined property: dbConnectMySQL::$password in /Applications/MAMP/htdocs/library/db.class.php on line 63
 
Erwin H

Erwin H

12/06/2012 18:12:51
Quote Anchor link
Ik zie wat je bedoelt, volgens mij maakt Wouter een foutje in zijn voorbeeld en moet
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
class DbConfigMySQL extends DbConfig
?>

zijn
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
class DbConnectMySQL extends DbConnect
?>

Maar aan Wouter voor het antwoord :-)
 
Wouter J

Wouter J

12/06/2012 19:30:05
Quote Anchor link
Ja, dat klopt. Zou het aanpassen.Aangepast
Gewijzigd op 12/06/2012 19:31:44 door Wouter J
 
Reshad F

Reshad F

12/06/2012 20:01:29
Quote Anchor link
oke maar dan krijg ik wel die foutmeldingen met undefined property voor de mysql_connect regel.

mijn code om alles aan te roepen en weergeven heb ik even zo..

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
<?php
    $config
= new dbConfig($adres, $gebruikersnaam, $wachtwoord, $databasenaam);
        $connectie = new dbConnectieMySQL($config);

    echo '<pre>';
    var_dump($connectie);

    $test = $config->startQuery("SELECT id, name, password FROM members");
    if($test === false)
    {

        echo 'kon niet benaderd worden';
    }

    else
    {
        while($row = mysql_fetch_assoc($test))
        {

            echo 'id: ' . $row['id'] . '<br>';
            echo 'name: ' . $row['name'] . '<br>';
            echo 'password: ' . $row['password'] . '<br><br>';
        }
    }

?>


en dit is de class http://pastebin.com/jjpd2hw1

ik heb config even gedumped zoals je ziet. maar ik krijg geen resultt en die undefined property voor deze regels in dbConnectMySQL

$this->dbConnect = mysql_connect($this->host, $this->username, $this->password);
$this->dbConnect = mysql_select_db($this->database);
 
Wouter J

Wouter J

12/06/2012 20:04:29
Quote Anchor link
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...
 
Reshad F

Reshad F

12/06/2012 20:05:38
Quote Anchor link
dat wordt toch in dbConfig gedaan?
 
Wouter J

Wouter J

12/06/2012 20:08:44
Quote Anchor link
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.
 
Reshad F

Reshad F

12/06/2012 20:33:40
Quote Anchor link
uhmm dus ik hoef in principe alleen host, username, password te definieren in dbConnect? dan krijg ik met vardumpp

object(dbConnectMySQL)#2 (7) {
["database":"dbConnectMySQL":private]=>
NULL
["startQuery"]=>
NULL
["getResults"]=>
NULL
["dbConfig":protected]=>
object(dbConfig)#1 (4) {
["type":protected]=>
string(9) "127.0.0.1"
["host":protected]=>
string(4) "root"
["username":protected]=>
string(4) "root"
["password":protected]=>
string(9) "portfolio"
}
["host":protected]=>
NULL
["username":protected]=>
NULL
["password":protected]=>
NULL
}

de waardes ervan zijn dus leegg

maar hoe set je die waardes dan in dbConnect?
 

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.