В 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, но оно устарело, и последняя версия была непригодна для использования.
Перегрузка функций в 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');
}
}
a.a=function(){
alert('b');
}
a.a(); // 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
Есть некоторые различия между перегрузкой функций & переопределение, хотя оба содержат одно и то же имя функции. При перегрузке между одинаковыми именами функции содержат разные типы аргументов или возвращаемые типы, такие как:
«функция add (int a, int b)» & «функция add (float a, float b);
Здесь функция add () перегружена.
В случае переопределения как аргумент, так и имя функции совпадают. Обычно они встречаются в наследовании или в признаках. Мы должны следовать некоторым тактикам, чтобы представить, какая функция будет выполняться сейчас.
Таким образом, при переопределении программист следует определенной тактике для выполнения желаемой функции, при которой при перегрузке программа может автоматически определить желаемую функцию … Спасибо!
Перегрузки: В реальном мире перегрузка означает назначение некоторого дополнительного материала кому-то. Как и в реальном мире, перегрузка в PHP означает вызов дополнительных функций. Другими словами, вы можете сказать, что у него более тонкая функция с другим параметром. В PHP вы можете использовать перегрузку с помощью магических функций, например. __get, __set, __call и т. д.
Пример перегрузки:
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
Переопределение: В объектно-ориентированном программировании переопределение — это замена родительского метода в дочернем классе. В переопределении вы можете повторно объявить метод родительского класса в дочернем классе. Итак, в основном цель переопределения — изменить поведение вашего родительского метода класса.
Пример переопределения:
class parent_class
{
public function text() //text() is a parent class method
{
echo "Hello!! everyone I am parent class text method"."</br>";
}
public function test()
{
echo "Hello!! I am second method of parent class"."</br>";
}
}
class child extends parent_class
{
public function text() // Text() parent class method which is override by child
class
{
echo "Hello!! Everyone i am child class";
}
}
$obj= new parent_class();
$obj->text(); // display the parent class method echo
$obj= new parent_class();
$obj->test();
$obj= new child();
$obj->text(); // display the child class method echo