PHP'nin aşırı fonksiyonu desteklemediğini kim söyledi? !!!
Aslında PHP, fonksiyonların aşırı yüklenmesini destekliyor ancak farklı bir şekilde. PHP'nin aşırı yükleme özellikleri Java'nınkinden farklı:
PHP'nin "aşırı yükleme" yorumu çoğu nesne yönelimli dilden farklıdır. Geleneksel olarak aşırı yükleme yapmak, aynı adda ancak farklı miktarlarda ve türlerde argümanlarla birden fazla yönteme sahip olma yeteneği sağlar.
Aşağıdaki kod bloklarını kontrol edin.
N sayısının toplamını bulma işlevi:
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
İki sayı ekleme veya iki dizeyi birleştirme işlevi:
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
Aşırı Yüklenme İçeren Nesneye Yönelik Yaklaşım:
PHP'de aşırı yükleme, dinamik olarak özellikleri ve yöntemleri "oluşturmak" için araçlar sağlar. Bu dinamik varlıklar, çeşitli eylem tipleri için bir sınıfta oluşturabilecekleri sihirli yöntemler ile işlenir.
Ref: http://php.net/manual/tr/language.oop5.overloading.php
PHP, sen gibi sihirli yöntemlerden bazılarını uygulayarak, çalışma anında nesne üye ekleyebilir aracı aşırı yükleme __set
, __get
, __call
vb
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