В 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 не является полностью ООП.