Begin in OOP
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:
Mijn code is dit:
Code (php)
1
2
3
4
5
6
7
8
9
10
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;
}
}
{
$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
Je bent waarschijnlijk vergeten het keyword new te gebruiken.
bedankt voor je bericht.
Ik heb m'n klasse geinstantieerd zoals het hoort:
Edit:
ik bedenk me nu, is de klassenaam 'mysql' soms een al bestaande class binnen php?
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
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.
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
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.
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) {.
Zou je op deze volledige code eens een aanpassing kunnen laten zien?
Code (php)
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
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();
?>
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
Ja, wat Jelmer zegt. Op regel 16 heb je een puntkomma aan het eind die er niet hoort.
Het is nu idd opgelost; waarschijnlijk uit gewoonte gedaan, omdat ik meestal
function() {
gebruik ipv
function()
{
Bedankt iig.
Prettige avond verder.
Groet,
Barry
Ik heb hier een class voor je.
enigste wat je moet doen is:
en daar hoort deze class bij
Code (php)
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
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("<", "<", $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;
}
}
?>
// 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("<", "<", $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)
1
2
3
4
2
3
4
<?php
$query = "SELECT * FROM table WHERE id = '1'";
$result = $this->db-query($query);
?>
$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
$result = $this->db->query($query);
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();
En die() is uit den bozen tegenwoordig!
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.
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)
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
Code (php)
Vaak is het aan de constructor meegeven een betere oplossing, maar dat is eigenlijk volledig afhankelijk van wat $nogIets is.
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
__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.
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
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;
}
}
{
$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.