class Shape {
const Pi = 3.142 ; // constant value
function __call($functionname, $argument){
if($functionname == 'area')
switch(count($argument)){
case 0 : return 0 ;
case 1 : return self::Pi * $argument[0] ; // 3.14 * 5
case 2 : return $argument[0] * $argument[1]; // 5 * 10
}
}
}
$circle = new Shape();`enter code here`
echo "Area of circle:".$circle->area()."</br>"; // display the area of circle Output 0
echo "Area of circle:".$circle->area(5)."</br>"; // display the area of circle
$rect = new Shape();
echo "Area of rectangle:".$rect->area(5,10); // display area of rectangle
<?php
class Foo {
function myFoo() {
return "Foo";
}
}
class Bar extends Foo {
function myFoo() {
return "Bar";
}
}
$foo = new Foo;
$bar = new Bar;
echo($foo->myFoo()); //"Foo"
echo($bar->myFoo()); //"Bar"
?>
Overriding
I metodi definiti in una classe padre, possono essere
sovrascritti (overriding) in una classe figlia
e, in questo caso, le funzioni ridefinite avranno
precedenza su quelle della classe padre.
Questo metodo è utile se si vuole utilizzare
la funzionalità del genitore o semplicemente aggiungere
ulteriori funzionalità nel metodo della sottoclasse.
Per ridefinire un metodo della superclasse in una sottoclasse,
si crea semplicemente un metodo nella classe figlia
con lo stesso nome del metodo della classe padre.
<?php
// dichiarazione della classe Person
class Person {
public $name;
// costruttore
function __construct($name) {
echo "Chiamata costruttore della Superclasse"."<br>";
// inizializzazione della proprietà $name
$this->name = $name;
}
// metodi
function viewHello() {
echo "Hello ".$this->name."<br>";
}
}
// definizione della sottoclasse Employees
class Employees extends Person {
public $profile;
// costruttore della sottoclasse
function __construct($name, $profile) {
parent::__construct($name); // chiamo il costruttore di Person
$this->profile = $profile; // inizializzo $profile
}
// metodi
function viewHello() {
parent::viewHello();
echo "Profile: ".$this->profile."<br>";
}
}
$customer = new Person("Giuseppe Rossi");
$customer->viewHello();
$employee = new Employees("Mario Rossi", "Admin");
$employee->viewHello();
?>
Come possiamo notare in questo caso, il metodo viewHello
di Employees va a sovrascrivere quello di Person.
Praticamente, il metodo viewHello di Employees
ignora quello di Person.
Per utilizzare l'istanza $employee al fine di accedere al metodo
viewHello di Person, utilizziamo la keyword parent, seguita
dall'operatore di risoluzione di scope ("::") e dal nome
dell'elemento desiderato. Questo permette di richiamare
gli elementi della classe genitore direttamente nelle sottoclassi.