Onderstaand script komt van http://www.phptuts.nl/view/45/8/ en ik probeer het volgende te begrijpen.
In class table function draw() staat:


<?php
foreach($row->getCells() as $cell) { 
   echo '<td>'.$cell->getContent().'</td>'.PHP_EOL; 
}
?>


Hoe kan het dat $row->getCells() en $cell->getContent() zonder het instantieren toch verschijnen?



<?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(); 

?>
Heeeeeel oud dit. maar geen reactie er onder. Beetje jammer. Bij deze dus.

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):


<?php
// let op de eerste regel waar nu Row voor $row staat
public function append(Row $row) { 
    $this->_rows[] = $row; 
}

 
?>

Reageren