Probeer PHP Tuts script te begrijpen
http://www.phptuts.nl/view/45/8/ en ik probeer het volgende te begrijpen.
In class table function draw() staat:
Hoe kan het dat $row->getCells() en $cell->getContent() zonder het instantieren toch verschijnen?
Onderstaand script komt van In class table function draw() staat:
Code (php)
Hoe kan het dat $row->getCells() en $cell->getContent() zonder het instantieren toch verschijnen?
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
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
<?php
class Table {
private $_rows;
public function __construct() {
$this->_rows = array();
}
public function append($row) {
$this->_rows[] = $row;
}
public function draw() {
echo '<table border="1">'.PHP_EOL; // Begin van de tabel, border voor de duidelijkheid
foreach($this->_rows as $row) {
echo '<tr>'.PHP_EOL;
foreach($row->getCells() as $cell) {
echo '<td>'.$cell->getContent().'</td>'.PHP_EOL;
}
echo '</tr>'.PHP_EOL;
}
echo '</table>'.PHP_EOL;
}
}
class Row {
private $_cells;
public function __construct() {
$this->_cells = array();
}
public function append($cell) {
$this->_cells[] = $cell;
}
public function getCells() {
return $this->_cells;
}
}
class Cell {
private $_content;
public function __construct($content) {
$this->_content = $content;
}
public function getContent() {
return $this->_content;
}
}
$cellA1 = new Cell('Dit is cel A1');
$cellA2 = new Cell('Dit is cel A2');
$rowA = new Row();
$rowA->append($cellA1);
$rowA->append($cellA2);
$table = new Table();
$table->append($rowA);
$table->draw();
?>
class Table {
private $_rows;
public function __construct() {
$this->_rows = array();
}
public function append($row) {
$this->_rows[] = $row;
}
public function draw() {
echo '<table border="1">'.PHP_EOL; // Begin van de tabel, border voor de duidelijkheid
foreach($this->_rows as $row) {
echo '<tr>'.PHP_EOL;
foreach($row->getCells() as $cell) {
echo '<td>'.$cell->getContent().'</td>'.PHP_EOL;
}
echo '</tr>'.PHP_EOL;
}
echo '</table>'.PHP_EOL;
}
}
class Row {
private $_cells;
public function __construct() {
$this->_cells = array();
}
public function append($cell) {
$this->_cells[] = $cell;
}
public function getCells() {
return $this->_cells;
}
}
class Cell {
private $_content;
public function __construct($content) {
$this->_content = $content;
}
public function getContent() {
return $this->_content;
}
}
$cellA1 = new Cell('Dit is cel A1');
$cellA2 = new Cell('Dit is cel A2');
$rowA = new Row();
$rowA->append($cellA1);
$rowA->append($cellA2);
$table = new Table();
$table->append($rowA);
$table->draw();
?>
Gewijzigd op 06/11/2012 10:27:49 door Bas D L
Kennelijk verwacht dit script dat je in de Table->append functie een object meegeeft van het type Row. Dat gebeurt in regel 67. Daar wordt $rowA die geinstantieerd is op regel 61. De array $this->_rows bestaat uit een lijst met objecten van het type row die dus al geinstantieerd zijn.
Er zitten gelijk wat slordigheidsfoutjes in:
- Append controleert zijn input niet. Dit kan van alles zijn waarmee Table->draw op zijn snufferd gaat.
- zelfde geld voor Row->append.
Valideer altijd je input, in dit geval kan de volgende declaratie volstaan (als in deze situatie de verkeerde datatype meegegeven wordt, gaat hij daar al op zijn plaat en niet later pas, waar het lastiger debuggen is):
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
// let op de eerste regel waar nu Row voor $row staat
public function append(Row $row) {
$this->_rows[] = $row;
}
?>
// let op de eerste regel waar nu Row voor $row staat
public function append(Row $row) {
$this->_rows[] = $row;
}
?>
Gewijzigd op 22/12/2014 14:32:05 door No One