Begin in OOP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Barry

Barry

30/07/2008 21:44:00
Quote Anchor link
Goedenavond mede PHP'ers.

Ik ben eindelijk begonnen met OOP.
(vanaf deze site).

Nu ik een simpele class probeer te schrijven om mysql connectie te vermakkelijken, heb ik een beginnetje gemaakt.

Helaas krijg ik deze error:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Fatal error: Non-abstract method mysql::setup() must contain body in /home/etc...


Mijn code is dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
function setup($server = 'localhost',$user,$pass,$passIsEncoded);
    {
        $this->server         =  $server;
        $this->username     =  $user;
        if($passIsEncoded   == true) {
            $this->password =  base64_decode($pass);
        } else {
            $this->password =  $pass;
        }
    }


in mijn pagina hierna, roep ik gewoon een andere functie met een echo erin aan, bovenstaande kom ik niet aan, en toch error't hij hier over!?

Ik hoop op jullie hulp.

Groet,

Barry
 
PHP hulp

PHP hulp

21/11/2024 20:32:46
 
Jan Koehoorn

Jan Koehoorn

30/07/2008 21:46:00
Quote Anchor link
Je bent waarschijnlijk vergeten het keyword new te gebruiken.
 
Barry

Barry

30/07/2008 21:48:00
Quote Anchor link
jan,

bedankt voor je bericht.

Ik heb m'n klasse geinstantieerd zoals het hoort:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
include('mysql.class.php');

$mysql = new mysql();


Edit:

ik bedenk me nu, is de klassenaam 'mysql' soms een al bestaande class binnen php?
Gewijzigd op 01/01/1970 01:00:00 door Barry
 
Jan Koehoorn

Jan Koehoorn

30/07/2008 21:52:00
Quote Anchor link
Je zou sowieso de naam kunnen veranderen in class.mysql.php. Maar de foutmelding die je krijgt gaat over het feit dat je functie als abstract gedeclareerd is. De body van die functie mag zich dus niet binnen die class bevinden. In de classes die overerven van je abstacte class moet je de body van die functie definiëren.
 
Barry

Barry

30/07/2008 21:54:00
Quote Anchor link
Bedankt voor je bericht.

Ik ben nog vrij nieuw in OOP (net begonnen) maar ik denk dat ik het doorheb.

Is abstract dan een soort sleutelwoord om aan te geven dat het een zelfstandige functie is? net zoiets als private en public?

(alvast) bedankt voor je uitleg.

Groet,

Barry
 
Jan Koehoorn

Jan Koehoorn

30/07/2008 22:00:00
Quote Anchor link
Nee, abstract is om aan te geven wat het geraamte van een functie is. Dus de naam van de functie, en wat voor argumenten erbij horen.

In een abstracte functie geef je dus eigenlijk de functie-declaratie en niet de functie-definitie. De functie-definitie geef je in classes die overerven van je parent-class.
 
Jelmer -

Jelmer -

30/07/2008 22:06:00
Quote Anchor link
Volgens mij komt de melding puur door de punt-komma na de naam van de functie (dus op regel 1) Bij abstracte functies is dit de normale manier, maar bij normale functies mag het niet. Daar moet je ) worden gevolgd door (witruimte of) {.
 
Barry

Barry

30/07/2008 22:07:00
Quote Anchor link
Ok, ik begin het een beetje te begrijpen.

Zou je op deze volledige code eens een aanpassing kunnen laten zien?

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 mysql
{
    
    private $username;
    private $password;
    private $server;
    private $database;

    function
mysql() // constructor?
    {
        
    }
    
    function
setup($server = 'localhost',$user,$pass,$passIsEncoded);
    {

        $this->server         =  $server;
        $this->username     =  $user;
        if($passIsEncoded   == true) {
            $this->password =  base64_decode($pass);
        }
else {
            $this->password =  $pass;
        }
    }
    
    function
database($db_name)
    {

        $this->database = $db_name;
    }
    
    function
connect()
    {

        echo 'hello world';
    }
}


$mysql = new mysql();

$mysql->connect();

?>


bvb dank,

groet,

Barry
 
Jan Koehoorn

Jan Koehoorn

30/07/2008 22:09:00
Quote Anchor link
Ja, wat Jelmer zegt. Op regel 16 heb je een puntkomma aan het eind die er niet hoort.
 
Barry

Barry

30/07/2008 22:11:00
Quote Anchor link
sorry jelmer, was aan het posten tijdens de jouwe.

Het is nu idd opgelost; waarschijnlijk uit gewoonte gedaan, omdat ik meestal

function() {

gebruik ipv

function()
{


Bedankt iig.

Prettige avond verder.

Groet,

Barry
 
Michel W

Michel W

31/07/2008 13:45:00
Quote Anchor link
Wat wil je met je class doen?

Ik heb hier een class voor je.
enigste wat je moet doen is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
include ("classes/mysql.php");
$db = new MySQL();
?>

en daar hoort deze class bij
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php
// Database Connection Class for MySQL

$sql = false;
$query = false;

class MySQL {
    var
$_handle;
    var
$_host;
    var
$debug = 1;

    var
$dbhost = "localhost";
    var
$dbuser = "db_username";
    var
$dbpasw = "db_pass";
    var
$dbname = "db_name";

    // Constructor
    function  __construct ()
    {

        $this->_host = $this->dbhost;

        $_handle = @mysql_connect ($this->dbhost, $this->dbuser, $this->dbpasw) or $this->error(mysql_error(), "");
        @
mysql_select_db ($this->dbname, $_handle) or $this->error(mysql_error(), "USE $dbname");
    }


    // Run query
    function query($query)
    {

        $result = mysql_query ($query) or $this->error (mysql_error(), $query);
        return $result;
    }


    // secure value
    function secure_value($value){
        $value = mysql_real_escape_string($value);
        return $value;
        
    }

    
    // Error handler
    function error($errorMsg, $query)
    {

        if ($this->debug) {
            echo "<table>" .
                 "<tr><td colspan=2 valign=top><font color=red><b>SQL error:</b></font></td></tr>\n" .
                 "<tr><td valign=top><b>Error:</b></td><td valign=top>" . $errorMsg .
                 "</td></tr>\n" . "<tr><td valign=top><b>Host:</b></td><td valign=top>" . $this->_host .
                 "</td></tr>\n" . "<tr><td valign=top><b>Query:</b></td><td valign=top>" .
                ((
$query) ? str_replace("<", "&lt;", $query) : "<i>null</i>") .
                "</td></tr></table>\n";
            die();
        }
else {
            die ("Er is een SQL fout opgetreden");
        }
    }


 

    // Quote smart
    function quotesmart($value)
    {

        // Stripslashes
        if (get_magic_quotes_gpc()) {
            $value = stripslashes($value);
        }

        // Quote if not integer
        if (!is_numeric($value)) {
            $value = mysql_real_escape_string($value);
        }

        return $value;
    }
}

?>


//edit: vergat de uitleg voor de werking:

In een andere class kun je dan deze class opnemen en krijg je zoiets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$query
= "SELECT * FROM table WHERE id = '1'";
$result = $this->db-query($query);
?>

en daar heb je dan je resultset, ik vind het persoonlijk fijn werken
Gewijzigd op 01/01/1970 01:00:00 door Michel W
 
Terence Hersbach

Terence Hersbach

31/07/2008 14:45:00
Quote Anchor link
@Dreampower, klein foutje:
$result = $this->db->query($query);
 
Robert Deiman

Robert Deiman

31/07/2008 15:00:00
Quote Anchor link
@Dreampower

Het leuke van een class met methods is vooral dat je de weergave buiten een class houdt. Wat jij hebt is zelfs complete echo's van dingen in je functies. Beter zou zijn om de functie de waarde te returnen (met return $varname) en dan te echo'en door:

echo $class->functienaam();
 
GaMer B

GaMer B

31/07/2008 15:12:00
Quote Anchor link
En die() is uit den bozen tegenwoordig!
 
Jelmer -

Jelmer -

31/07/2008 15:33:00
Quote Anchor link
... vertel dan ook meteen even waarom je echo's en die() buiten de klasse moet houden...

Echo'en en die() binnen een klasse gebruiken is niet handig omdat op die manier je klasse eigenlijk net iets teveel doet. Voorbeeldje: Stel dat jij een query hebt waarvan je weet dat hij wel eens fout zou kunnen gaan, bijvoorbeeld een INSERT in je user-tabel waarbij de gebruikersnaam uniek moet zijn. En je wilt deze fouten afvangen en dan het formulier weer terug op het scherm toveren zodat de nieuwe bezoeker zijn gebruikersnaam kan veranderen in iets anders. Met jouw klasse kan dat op het moment niet omdat hij oordeelt dat je script moet stoppen bij een fout, en de foutmelding op het scherm moet komen. Jij wilt gewoon doorgaan met je script, alleen langs een andere route. En je wilt de gebruiker vertellen dat hij een andere gebruikersnaam moet kiezen, niet de foutmelding van MySQL laten zien.

Daarom is het niet handig om foutenafhandeling op zo'n manier op te lossen binnen je klasse. Handiger is inderdaad om zoals Robert_Deiman al aangeeft 'return' te gebruiken, en bij fouten kan je goed exceptions gebruiken. Exceptions oordelen niet dat dat wat er nu gebeurt fout is, maar dat het niet is wat de klasse verwacht. Het is aan jouw om binnen je code (en buiten de klasse) te oordelen of het ook werkelijk goed fout gaat, of dat de exception te verwachten was.
 
Barry

Barry

31/07/2008 20:56:00
Quote Anchor link
Hallo allemaal,

bedankt voor al die reacties.
Erg leerzaam.

@dreampower {
ik dacht dat het makkelijk was om een klasse voor mysql te schijven aangezien ik _net_ begin met oop. Het is m'n eerste klass op de hello world na!
}


@jelmer {
toevallig, maar ik vond het zelf al verveld om binnen een public function (noem je dit daadwerkelijk zo?) iets te echo'en, er buiten met een return idd, is veel makkelijker en flexibeler
}

Ik heb nu wel weer een vraag,
zelf heb ik het idee dat het niet kan:

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
$iets
= "string"

class eenKlasse
{

     private $nogIets = $iets;

// rest klasse

}

?>


volgens PHP is het aanroepen van de $iets, welke buiten de klasse bestaat, niet mogelijk omdat hij 'm dan niet kan vinden.
Is hier een workaround voor?

Groet,

Barry
Gewijzigd op 01/01/1970 01:00:00 door Barry
 
Jelmer -

Jelmer -

31/07/2008 21:04:00
Quote Anchor link
Ja, die is er, maar ik raadt hem niet aan. Je maakt nu je klasse afhankelijk van het bestaan van variabelen erbuiten (in de global scope)

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
<?php
$iets
= "string";

class EenKlasse {

    private $nogIets;

    public function __construct() {
        global $iets;

        $this->nogIets = $iets;
    }
}

?>

Vaak is het aan de constructor meegeven een betere oplossing, maar dat is eigenlijk volledig afhankelijk van wat $nogIets is.
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
<?php

$iets
= 'string';

class EenKlasse {

    protected $nogIets;

    public function __construct($iets) {
        $this->nogIets = $iets;
    }
}


$instantie = new EenKlasse($iets);
?>
 
Barry

Barry

31/07/2008 21:09:00
Quote Anchor link
jelmer, bedankt voor je post.
ik snap wat je bedoelt en zie ook het probleempje er van in.
Ga het toch even proberen, aangezien deze klasse alleen binnen het document blijft en nergens anders gebruikt wordt. Hij mág dus afhankelijk zijn.

meteen even een vraagje,
ik heb geleer dat je constructor een functie met dezelfde naam als de klasse is, maar is __construct() gewoon een manier om de naam van je klasse niet opnieuw te hoeven typen (voor het geval deze veranderd?)?



Barry
 
Jan Koehoorn

Jan Koehoorn

31/07/2008 22:16:00
Quote Anchor link
__construct is een van de magic functions van PHP5. In PHP4 moet je als constructor een functie met dezelfde naam als de naam van de class gebruiken.
 
Robert Deiman

Robert Deiman

31/07/2008 22:32:00
Quote Anchor link
Jelmer, bedankt voor de aanvulling.

Een andere reden om een echo niet in een class te gebruiken:
- Je beperkt jezelf in de mogelijkheden met de output. Meestal geven mijn functies een bepaalde waarde terug, die je op een bepaalde plek in de pagina wilt laten zien.
 
Jacco Engel

Jacco Engel

01/08/2008 08:37:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
function setup($server = 'localhost',$user,$pass,$passIsEncoded);
    {
        $this->server         =  $server;
        $this->username     =  $user;
        if($passIsEncoded   == true) {
            $this->password =  base64_decode($pass);
        } else {
            $this->password =  $pass;
        }
    }


Nog even hier op terug komende, wil ik je de tip geven om optionele variabelen altijd aan het eind te zetten. Want het hele doel van optionele variabelen is dat je ze niet altijd hoeft in te vullen. Dat moet je nu echter altijd wel omdat alle variabelen er na wel verplicht zijn.
 

Pagina: 1 2 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.