Verder gaan met OOP
Ik heb hier de beginnershandeleiding (Lang woord =')) gelezen voor OOP maar ik zou graag verder gaan dan dat, heeft iemand nog goede tutorials die ook abstract classes etc. beter uitleggen.
Pim en Jelmer door en kijk eens in het OO forumdeel. Daar wordt vaak goede uitgebreide uitleg gegeven en probeer eens wat.
Of vraag het anders eens hier op het forum, wat begrijp je bijv. niet aan abstract classes? Ik (en andere) willen het je best uitleggen, maar dan moet het wel wat concreter zijn.
Lees eens wat reacties van Of vraag het anders eens hier op het forum, wat begrijp je bijv. niet aan abstract classes? Ik (en andere) willen het je best uitleggen, maar dan moet het wel wat concreter zijn.
Ik snap niet wat het doet eerlijk gezegd. Verplichten om iets in te geven?
Maar ze hebben ook nog verschillen, de admin kan meer en heeft andere rechten.
In dit geval zou het zoiets worden:
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
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
<?php
class User
{
protected $name; // de naam
protected $rank; // de rank, member = 1 admin = 2
public function __construct( $name )
{
$this->name = $name;
$this->setRank(); // deze method moet worden gemaakt in de child class
}
public function getName()
{
return $this->name;
}
}
class Member extends User
{
protected function setRank()
{
$this->rank = 1;
}
}
class Admin extends User
{
protected function setRank()
{
$this->rank = 2;
}
}
$robin = new Member('robin');
$robin->getName(); // robin
$bas = new Admin('bas');
$bas->getName(); // bas
?>
class User
{
protected $name; // de naam
protected $rank; // de rank, member = 1 admin = 2
public function __construct( $name )
{
$this->name = $name;
$this->setRank(); // deze method moet worden gemaakt in de child class
}
public function getName()
{
return $this->name;
}
}
class Member extends User
{
protected function setRank()
{
$this->rank = 1;
}
}
class Admin extends User
{
protected function setRank()
{
$this->rank = 2;
}
}
$robin = new Member('robin');
$robin->getName(); // robin
$bas = new Admin('bas');
$bas->getName(); // bas
?>
Dit systeem werkt leuk, alleen we zitten met 2 problemen:
1) we zouden geen user object mogen kunnen maken. Die moet eigenlijk niet bestaan.
2) we kunnen vergeten de setRank method te maken. Hierdoor kunnen we een error krijgen.
Beide problemen zijn op te lossen met een abstract class. Als we de User class abstract maken zorgen we ervoor dat we geen new User(); kunnen gebruiken. En als we nou in deze abstracte class een abstract method setRank aanmaken krijgen we een error als we die vergeten te maken:
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
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
<?php
abstract class User
{
protected $name; // de naam
protected $rank; // de rank, member = 1 admin = 2
public function __construct( $name )
{
$this->name = $name;
$this->setRank(); // deze method moet worden gemaakt in de child class
}
public function getName()
{
return $this->name;
}
// zorg dat we verplicht zijn een setRank method te maken
protected abstract function setRank();
}
class Admin extends User
{
protected function setRank()
{
$this->rank = 2;
}
}
class Beheerder extends User
{
public function editPage()
{
// doe wat leuks, merk op dat we hier geen setRank method maken
// we krijgen nu dus een error omdat deze method mist.
}
}
$robin = new User('robin'); // error, user is abstract en kunnen we dus niet aanmaken
$bas = new Beheerder('bas'); // werkt niet, door de error
$erik = new Admin('erik'); // werkt goed
?>
abstract class User
{
protected $name; // de naam
protected $rank; // de rank, member = 1 admin = 2
public function __construct( $name )
{
$this->name = $name;
$this->setRank(); // deze method moet worden gemaakt in de child class
}
public function getName()
{
return $this->name;
}
// zorg dat we verplicht zijn een setRank method te maken
protected abstract function setRank();
}
class Admin extends User
{
protected function setRank()
{
$this->rank = 2;
}
}
class Beheerder extends User
{
public function editPage()
{
// doe wat leuks, merk op dat we hier geen setRank method maken
// we krijgen nu dus een error omdat deze method mist.
}
}
$robin = new User('robin'); // error, user is abstract en kunnen we dus niet aanmaken
$bas = new Beheerder('bas'); // werkt niet, door de error
$erik = new Admin('erik'); // werkt goed
?>
Ik hoop dat het wat duidelijker is geworden. Een goed nut van abstract classes kun je bijv. hier vinden: http://www.phphulp.nl/php/forum/topic/de-opbouw-van-een-logging-class/81508/#577390
Omdat de functie "geef_geluid" wel in de parent is aangemaakt kan je hem daar wel aanroepen, maar wat er uitkomt is afhankelijk van de kind class die is aangemaakt.
Een meer praktisch voorbeeld is een HTML object dat ik gebruik. Mijn hoofd class maakt de HTML structuur op, maar niet de pagina. Dus wel de html, head en body tag, maar niet de rest. Het definieert wel al een functie "write_body()", maar dan abstract. Elk kind class moet die functie dus definieren, zodat ik in mijn hoofd class die functie kan aanroepen binnen de body tags, zonder verder te hoeven weten wat er dan uit zal komen.
Erwin: waarom zou je in godsnaam gebruik maken van PHP om een HTML pagina op de maken? (Vooral de body) Misschien een CMS maar dan werk je beter met een DB. Even om het de verduidelijken wat ik bedoel.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<!-- Gemaakt in de browser, vandaar geen whitespace. =)-->
<!doctype html>
<html lang="nl">
<head>
</head>
<body>
<?php
mysql_query("select info from table where id='$_GET['id']'"); //Query is waarschijnlijk niet juist, ik weet het. Vergeten hoe je ook alweer met get in een query werkt. =')
?>
</body>
<!doctype html>
<html lang="nl">
<head>
</head>
<body>
<?php
mysql_query("select info from table where id='$_GET['id']'"); //Query is waarschijnlijk niet juist, ik weet het. Vergeten hoe je ook alweer met get in een query werkt. =')
?>
</body>
Weet iemand nog een boek/tutorial waar er verder wordt gegaan op deze dingen. Ik neem aan dat ik nog niet alles weet van OOP na die simpele tutorial. =')
Gewijzigd op 05/02/2012 15:00:17 door Robin Van den Broeck
Robin Van den Broeck op 05/02/2012 14:59:21:
Erwin: waarom zou je in godsnaam gebruik maken van PHP om een HTML pagina op de maken? (Vooral de body) Misschien een CMS maar dan werk je beter met een DB. Even om het de verduidelijken wat ik bedoel.
Waarom?
Omdat ik vele verschillende pagina's heb die allemaal dezelfde basis layout hebben en elke keer een deel anders is. Feitelijk heb ik een basis object dat de pagina opmaakt, daarna een object dat de grote lijnen invult en tenslotte een pagina specifiek opbject dat alle pagina specifieke delen erin zet. Op die manier hoef ik niet elk HTML bestand of php (met HTML) bestand aan te passen als ik bijvoorbeeld mijn hoofd structuur van de pagina wil aanpassen. En als ik een nieuwe pagina erbij wil hebben hoef ik over een heel groot deel me geen zorgen meer te maken, want dat gaat automatisch goed.
En deze opbjecten handelen overigens niet alleen de HTML af, maar bijvoorbeeld ook welke CSS en JS bestanden geladen moeten worden.
Ik maak overigens geen gebruik van een CMS, uiteraard wel extensief van databases.
Maar uit je opmerking begrijp ik dat jij het allemaal beter weet?
Maar nu ik die informatie heb snap ik wel wat je bedoelt. Iedereen heeft zo zijn eigen manieren niet?
Als je alleen wilt weten waarom, vraag dat dan. Als je gaat zeggen "waarom zou je in godsnaam" dan blijkt daar niet echt uit dat je geinteresseerd ben in een uitleg, maar meer dat je jouw mening al hebt bepaald. Vandaar mijn laatste opmerking.
Een interface is ook iets soortgelijks echter heeft deze als voordeel dat je niet gelimiteerd bent aan 1 interface. Nadeel is echter dat je geen functionaliteit kunt beschrijven in een interface. Een interface heeft echter eerder als doel iets te omschrijven dat later in andere objecten gebruikt kan worden om bijvoorbeeld te laten itereren.
@Erwin: ik zal volgende keer het niet meer zeggen? Oké?
Toevoeging op 05/02/2012 17:24:19:
Wat vinden jullie van dit?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
interface Db {
public function connect();
public function error();
public function errorno();
public function escape($string);
public function query($query);
public function fetchArray();
public function fetchRow();
public function fetchAssoc();
public function fetchObject();
public function numRows();
public function close();
}
?>
interface Db {
public function connect();
public function error();
public function errorno();
public function escape($string);
public function query($query);
public function fetchArray();
public function fetchRow();
public function fetchAssoc();
public function fetchObject();
public function numRows();
public function close();
}
?>
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
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
<?php
class Mysql implements Db {
public function connect($username,$password,$server,$database){
mysql_connect($server, $username, $password);
mysql_select_db($database);
}
public function error() {
mysql_error();
}
public function errorno() {
mysql_errorno();
}
public function escape($string) {
mysql_real_escape_string($string);
}
public function query($query) {
mysql_query($query);
}
public function fetchArray($result) {
mysql_fetch_array($result);
}
public function fetchAssoc($result) {
mysql_fetch_assoc($result);
}
public function fetchObject($result) {
mysql_fetch_object($result);
}
public function fetchRow($result) {
mysql_fetch_row($result);
}
public function close() {
mysql_close();
}
}
?>
class Mysql implements Db {
public function connect($username,$password,$server,$database){
mysql_connect($server, $username, $password);
mysql_select_db($database);
}
public function error() {
mysql_error();
}
public function errorno() {
mysql_errorno();
}
public function escape($string) {
mysql_real_escape_string($string);
}
public function query($query) {
mysql_query($query);
}
public function fetchArray($result) {
mysql_fetch_array($result);
}
public function fetchAssoc($result) {
mysql_fetch_assoc($result);
}
public function fetchObject($result) {
mysql_fetch_object($result);
}
public function fetchRow($result) {
mysql_fetch_row($result);
}
public function close() {
mysql_close();
}
}
?>
Toevoeging op 05/02/2012 17:56:43:
Na wat aanpassingen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
interface DB {
public function connect();
public function error();
public function errorno();
public function escape($string);
public function query($query);
public function fetchArray($result);
public function fetchRow($result);
public function fetchAssoc($result);
public function fetchObject($result);
public function numRows($result);
public function close();
}
?>
interface DB {
public function connect();
public function error();
public function errorno();
public function escape($string);
public function query($query);
public function fetchArray($result);
public function fetchRow($result);
public function fetchAssoc($result);
public function fetchObject($result);
public function numRows($result);
public function close();
}
?>
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
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
<?php
require("db.interface.php"); //Interface verkrijgen
class Mysql implements DB {
public function connect($server,$username,$password,$database){
mysql_connect($server, $username, $password) or die('Kan geen verbinding maken met de database server');
mysql_select_db($database) or die('Kan de db niet selecteren.');
}
public function error() {
mysql_error();
}
public function errorno() {
mysql_errorno();
}
public function escape($string) {
mysql_real_escape_string($string);
}
public function query($query) {
mysql_query($query);
}
public function fetchArray($result) {
mysql_fetch_array($result);
}
public function fetchAssoc($result) {
mysql_fetch_assoc($result);
}
public function fetchObject($result) {
mysql_fetch_object($result);
}
public function fetchRow($result) {
mysql_fetch_row($result);
}
public function numRows($result) {
mysql_num_rows($result);
}
public function close() {
mysql_close();
}
}
?>
require("db.interface.php"); //Interface verkrijgen
class Mysql implements DB {
public function connect($server,$username,$password,$database){
mysql_connect($server, $username, $password) or die('Kan geen verbinding maken met de database server');
mysql_select_db($database) or die('Kan de db niet selecteren.');
}
public function error() {
mysql_error();
}
public function errorno() {
mysql_errorno();
}
public function escape($string) {
mysql_real_escape_string($string);
}
public function query($query) {
mysql_query($query);
}
public function fetchArray($result) {
mysql_fetch_array($result);
}
public function fetchAssoc($result) {
mysql_fetch_assoc($result);
}
public function fetchObject($result) {
mysql_fetch_object($result);
}
public function fetchRow($result) {
mysql_fetch_row($result);
}
public function numRows($result) {
mysql_num_rows($result);
}
public function close() {
mysql_close();
}
}
?>