Что такое перегрузка и переопределение функций в php?

В PHP, что вы понимаете под перегрузкой функций и переопределением функций. и в чем разница между ними? не могли понять, в чем разница между ними.

Перегрузка – это функции, имеющие аналогичные подписи, но имеющие разные параметры. Переопределение относится только к производным классам, где родительский класс определил метод, и производный класс хочет переопределить этот метод.

В PHP вы можете только перегружать методы с помощью магического метода __call .

Пример переопределения :

 <?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" ?> 

Перегрузка функций происходит, когда вы определяете одно и то же имя функции дважды (или более) с использованием другого набора параметров. Например:

 class Addition { function compute($first, $second) { return $first+$second; } function compute($first, $second, $third) { return $first+$second+$third; } } 

В приведенном выше примере compute функции перегружается двумя различными сигнатурами параметров. * Это еще не поддерживается в PHP. Альтернативой является использование необязательных аргументов:

 class Addition { function compute($first, $second, $third = 0) { return $first+$second+$third; } } 

Переопределение функции происходит, когда вы расширяете класс и переписываете функцию, существующую в родительском классе:

 class Substraction extends Addition { function compute($first, $second, $third = 0) { return $first-$second-$third; } } 

Например, compute переопределяет поведение, указанное в Addition .

Строго говоря, нет никакой разницы, так как вы не можете этого сделать 🙂

Переопределение функций могло быть сделано с расширением PHP, например APD, но оно устарело, а последняя версия afaik была непригодной.

Перегрузка функций в PHP не может быть выполнена из-за динамической типизации, т. Е. В PHP вы не определяете переменные как особый тип. Пример:

 $a=1; $a='1'; $a=true; $a=doSomething(); 

Каждая переменная имеет другой тип, но вы можете знать тип перед исполнением (см. Четвертый). Для сравнения используются другие языки:

 int a=1; String s="1"; bool a=true; something a=doSomething(); 

В последнем примере вы должны принудительно установить тип переменной (в качестве примера я использовал тип данных «что-то»).


Другая «проблема», почему перегрузка функций невозможна в PHP: PHP имеет функцию func_get_args (), которая возвращает массив текущих аргументов, теперь рассмотрим следующий код:

 function hello($a){ print_r(func_get_args()); } function hello($a,$a){ print_r(func_get_args()); } hello('a'); hello('a','b'); 

Учитывая, что обе функции принимают любое количество аргументов, которые должен выбрать компилятор?


Наконец, я хотел бы указать, почему приведенные выше ответы частично ошибочны; функция перегрузки / переопределения НЕ равна перегрузке / переопределению метода .

Если метод похож на функцию, но специфичен для класса, в этом случае PHP разрешает переопределять классы, но опять же не перегружает из-за семантики языка.

В заключение, такие языки, как Javascript, позволяют переопределять (но опять же, не перегружать), однако они также могут показать разницу между переопределением пользовательской функции и методом:

 /// Function Overriding /// function a(){ alert('a'); } a=function(){ alert('b'); } a(); // shows popup with 'b' /// Method Overriding /// var a={ "a":function(){ alert('a'); } } aa=function(){ alert('b'); } aa(); // shows popup with 'b' 

Пример перегрузки

 class overload { public $name; public function __construct($agr) { $this->name = $agr; } public function __call($methodname, $agrument) { if($methodname == 'sum2') { if(count($agrument) == 2) { $this->sum($agrument[0], $agrument[1]); } if(count($agrument) == 3) { echo $this->sum1($agrument[0], $agrument[1], $agrument[2]); } } } public function sum($a, $b) { return $a + $b; } public function sum1($a,$b,$c) { return $a + $b + $c; } } $object = new overload('Sum'); echo $object->sum2(1,2,3); 

Хотя перегрузка парадигмы не полностью поддерживается PHP, тот же (или очень похожий) эффект может быть достигнут с помощью параметра (ов) по умолчанию (как упоминалось ранее).

Если вы определяете свою функцию следующим образом:

 function f($p=0) { if($p) { //implement functionality #1 here } else { //implement functionality #2 here } } 

Когда вы вызываете эту функцию, например:

 f(); 

вы получите одну функциональность (# 1), но если вы вызовете ее с параметром, например:

 f(1); 

вы получите другую функциональность (# 2). Это эффект перегрузки – разные функциональные возможности в зависимости от входных параметров (функций) функции.

Я знаю, кто-нибудь спросит, какую функциональность получит, если он / она называет эту функцию как f (0).

Я хотел бы отметить здесь, что перегрузка в PHP имеет совершенно иное значение по сравнению с другими языками программирования. Многие люди говорили, что перегрузка не поддерживается в PHP и обычным определением перегрузки, да, что функциональность явно не доступна.

Однако правильное определение перегрузки в PHP совершенно иное.

В PHP перегрузка относится к динамическому созданию свойств и методов с использованием магических методов, таких как __set () и __get (). Эти методы перегрузки вызывается при взаимодействии с методами или свойствами, которые недоступны или не объявлены.

Вот ссылка из руководства PHP: http://www.php.net/manual/en/language.oop5.overloading.php

PHP 5.xx не поддерживает перегрузку, поэтому PHP не является полностью ООП.