Chi ti ha detto che PHP non supporta il sovraccarico delle funzioni? !!!
In realtà PHP supporta il sovraccarico delle funzioni, ma in modo diverso. Le funzionalità di sovraccarico di PHP sono diverse da quelle di Java:
L'interpretazione di PHP del "sovraccarico" è diversa dalla maggior parte dei linguaggi orientati agli oggetti. Il sovraccarico offre tradizionalmente la possibilità di avere più metodi con lo stesso nome ma con quantità e tipi di argomenti diversi.
Verifica i seguenti blocchi di codice.
Funzione per trovare la somma di n numeri:
function findSum() {
$sum = 0;
foreach (func_get_args() as $arg) {
$sum += $arg;
}
return $sum;
}
echo findSum(1, 2), '<br />'; //outputs 3
echo findSum(10, 2, 100), '<br />'; //outputs 112
echo findSum(10, 22, 0.5, 0.75, 12.50), '<br />'; //outputs 45.75
Funzione per aggiungere due numeri o concatenare due stringhe:
function add() {
//cross check for exactly two parameters passed
//while calling this function
if (func_num_args() != 2) {
trigger_error('Expecting two arguments', E_USER_ERROR);
}
//getting two arguments
$args = func_get_args();
$arg1 = $args[0];
$arg2 = $args[1];
//check whether they are integers
if (is_int($arg1) && is_int($arg2)) {
//return sum of two numbers
return $arg1 + $arg2;
}
//check whether they are strings
if (is_string($arg1) && is_string($arg2)) {
//return concatenated string
return $arg1 . ' ' . $arg2;
}
trigger_error('Incorrect parameters passed', E_USER_ERROR);
}
echo add(10, 15), '<br />'; //outputs 25
echo add("Hello", "World"), '<br />'; //outputs Hello World
Approccio orientato agli oggetti incluso il sovraccarico del metodo:
Il sovraccarico in PHP fornisce mezzi per "creare" dinamicamente proprietà e metodi. Queste entità dinamiche vengono elaborate tramite metodi magici che si possono stabilire in una classe per vari tipi di azioni.
Rif: http://php.net/manual/en/language.oop5.overloading.php
In PHP, mezzi sovraccarico è possibile aggiungere i membri di oggetto a run-time, mediante l'attuazione di alcuni dei metodi magici come __set
, __get
, __call
etc.
class Foo {
public function __call($method, $args) {
if ($method === 'findSum') {
echo 'Sum is calculated to ' . $this->_getSum($args);
} else {
echo "Called method $method";
}
}
private function _getSum($args) {
$sum = 0;
foreach ($args as $arg) {
$sum += $arg;
}
return $sum;
}
}
$foo = new Foo;
$foo->bar1(); // Called method bar1
$foo->bar2(); // Called method bar2
$foo->findSum(10, 50, 30); //Sum is calculated to 90
$foo->findSum(10.75, 101); //Sum is calculated to 111.75