Maak ik dan een klasse aan voor bijvoorbeeld het checken van een telefoonnummer (mobiel) die alleen controlleert of een 06 nummer daadwerkelijk ook strat met 06 ( en voor andere landen bijvoorbeeld 049 gebruikt als een bepaalde voorwaarde waar is)?
Even een voorbeeldje.
<?php
class phoneNumber {
private $number;
public function __construct($number) {
$this->number = $number;
}
public function validate() {
// kijk of de gegeven waarde geen float(10.5) is en wel een integer (1234)
if(is_numeric($this->number) && !(strpos($this->number, "."))) {
$this->number = intval($this->number);
}
if(!is_int($this->number)) {
throw new InvalidArgumentException('Gebruiker heeft geen integer ingevoerd: ' . $this->number);
return false;
}
// check of dit nummer uit 10 cijfers bestaat. > 9 omdat 0 niet meegeteld wordt ( ik ben geen regex expert)
elseif(!(preg_match('/^\d{9}$/', $this->number))) {
throw new LengthException('Nummer voldoet niet aan de nederlandse notatie: ' . $this->number);
return false;
}
else {
return true;
}
}
}
$number = new phoneNumber(0613266263);
echo $number->validate();
?>
In het voorbeeldje hierboven zie je dat dit werkt voor de nederlandse manier. maar wat als je nu een systeem nodig hebt die kan checken voor zowel een Nederlandse, Buitenlandse 1, Buitenlandse 2, Buitenlandse 3.. tsja dan stel je natuurlijk een contract op waarbij je klasses dwingt om op een bepaalde manier nummers te gaan controleren Hoe die klasses dat doen? dat mogen ze zelf weten. als ze maar wel de benodigde methoden implementeren. Wat je nu kan doen hiervoor is een interface gebruiken ( alleen methoden declareren ) of een abstracte klasse maken waarbij je de validate methode als abstract declareert en deze door de klassen die deze abstracte methode overerven het validate gedeelte doen.
Hier geef ik je de tip om wanneer mogelijk een interface te gebruiken omdat je waar mogelijk moet programmeren naar een interface en niet naar een implementatie toe.
Wat onze code nu dus kan worden is
<?php
interface phoneNumber {
public function validate();
}
class dutchPhoneNumber implements phoneNumber{
private $number;
public function __construct($number) {
$this->number = $number;
}
public function validate() {
// kijk of de gegeven waarde geen float(10.5) is en wel een integer (1234)
if(is_numeric($this->number) && !(strpos($this->number, "."))) {
$this->number = intval($this->number);
}
if(!is_int($this->number)) {
throw new InvalidArgumentException('Gebruiker heeft geen integer ingevoerd: ' . $this->number);
return false;
}
// check of dit nummer uit 10 cijfers bestaat. ( regex niet getest )
elseif(!(preg_match('/^\d{10}$/', $this->number))) {
throw new LengthException('Nummer voldoet niet aan de nederlandse notatie: ' . $this->number);
return false;
}
else {
return true;
}
}
}
class germanPhoneNumber implements phoneNumber{
private $number;
public function __construct($number) {
$this->number = $number;
}
public function validate() {
// kijk of de gegeven waarde geen float(10.5) is en wel een integer (1234)
if(is_numeric($this->number) && !(strpos($this->number, "."))) {
$this->number = intval($this->number);
}
if(!is_int($this->number)) {
throw new InvalidArgumentException('Gebruiker heeft geen integer ingevoerd: ' . $this->number);
return false;
}
// hier kijken we of er 11 cijfers voorkomen. ( regex niet getest )
elseif(!(preg_match('/^\d{11}$/', $this->number))) {
throw new LengthException('Nummer voldoet niet aan de duitse notatie: ' . $this->number);
return false;
}
else {
return true;
}
}
}
$number = new dutchPhoneNumber(06123456789);
echo $number->validate();
$number = new germanPhoneNumber(06123456789);
echo $number->validate();
?>