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

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


person Parag    schedule 08.06.2010    source источник
comment
Вы можете использовать перегружаемый класс по этой ссылке: stackoverflow.com/questions/ 4697705 / PHP-функция-перегрузка /   -  person Hisham Dalal    schedule 01.12.2014


Ответы (10)


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

В 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"
?>
person Jacob Relkin    schedule 08.06.2010
comment
Однако PHP не поддерживает перегрузку. - person Sasha Chedygov; 08.06.2010
comment
Да, используется __call. - person Jacob Relkin; 08.06.2010
comment
PHP заменяет перегрузку необязательными параметрами. - person b01; 17.03.2012
comment
Спасибо за идею необязательных параметров, это действительно полезный совет - person Rudolf Real; 27.08.2012
comment
__call () запускается, когда недоступные методы вызываются в контексте объекта. __callStatic () мегатод запускается, когда недоступные методы вызываются в статическом контексте. Следуйте этому, чтобы получить более подробный пример и объяснение перегрузки в контексте PHP: Перегрузка PHP - person Code Buster; 04.09.2013
comment
@ b01 Действительно заменяет; примерно так же можно заменить отвертку бананом. Это может сработать, может сработать, но в большинстве случаев это не так. - person Dan Lugg; 06.09.2013
comment
Я был здесь, чтобы сказать то же самое, что сказал Дэн ... Перегрузка позволяет вам создавать РАЗНЫЕ ФУНКЦИИ с одним и тем же именем ... в зависимости от того, какие параметры вы передаете, он будет использовать тот или иной ... но необязательные параметры позволяют вам создать ОДНУ ФУНКЦИЮ с более или менее параметрами ... что приведет к дальнейшей проверке параметров и различному поведению функции в зависимости от параметров ... и это не очень интуитивно понятно и не продуктивно ... - person KnF; 23.08.2014
comment
Также необходимо отметить: parent::myFoo(); внутри Bar- ›myFoo () вызывает Foo-› myFoo () в Bar. - person Fandi Susanto; 20.04.2016
comment
@ b01 Вы ошибаетесь. PHP не заменяет перегрузку через необязательные параметры. Если вы передадите в функцию необязательные параметры, тогда функция все равно получит определенное количество аргументов (переданные аргументы + необязательные аргументы). Это связано с тем, что при объявлении функции все еще определяются необязательные аргументы. Но при перегрузке вы не получаете фиксированного количества аргументов. Подпись такая же, но другое количество аргументов. На самом деле PHP НЕ ПОДДЕРЖИВАЕТ концепцию перегрузки. - person Ashish Choudhary; 01.08.2016
comment
Как сказал @Andrew Moore. Это грязный взлом. Вы делаете волшебный метод (вызов __) и играете с любой неопределенной функцией, но это не означает ее перегрузку. Если перегрузка имеет какое-либо отношение к PHP, то это из-за таких функций, как func_get_args () и func_num_args (), которые действительно позволяют людям заставить PHP вести себя так, как он выполняет перегрузку. - person Ashish Choudhary; 01.08.2016
comment
Необязательные параметры или func_get_args() или func_num_args() не имеют абсолютно ничего общего с перегрузкой. Настоящая перегрузка означает, что вы можете объявить myFunc(\DateTime $foo) и myFunc(\Vendor\Package\Model $bar, int $baz), которые ведут себя совершенно по-разному. Перегрузка означает наличие разных типов (и, возможно, также другого количества) аргументов и другой реализации. - person Foo Bar; 29.08.2017

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

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.

person Andrew Moore    schedule 08.06.2010
comment
За исключением того, что перегрузка функций не поддерживается в PHP, AFAIK. Кроме того, в качестве несвязанного побочного примечания, я не уверен, почему вам нужно, чтобы класс Subtraction расширял класс Addition. :) - person Sasha Chedygov; 08.06.2010
comment
@musicfreak: 00:40 по местному времени ... Не могу придумать лучшего примера. - person Andrew Moore; 08.06.2010
comment
Не беспокойтесь, я просто дразню. :) - person Sasha Chedygov; 08.06.2010
comment
Это пока не поддерживается в PHP и, вероятно, никогда не будет, поскольку PHP - это слабо типизированный язык, и в этом случае ничего не изменится. - person Crozin; 31.08.2010
comment
Перегрузка возникает не только тогда, когда вы определяете одно и то же имя функции дважды (или более раз) с использованием разных наборов параметров. Как правило, перегрузка также возникает, когда вы определяете одно и то же имя функции дважды (или более раз), используя одно и то же количество параметров, но разных типов. Поскольку в PHP нет объявления типа переменной (как в Java), это обобщение не имеет значения. Я просто упомянул об этом для точности, что такое перегрузка. - person sbrbot; 24.01.2013
comment
@sbrbot: Набор подразумевает как количество, так и типы. - person Andrew Moore; 24.01.2013
comment
почему использовать optionalparam стандартным способом является использование магических методов - person ujwal dhakal; 25.01.2016

Строго говоря, разницы нет, так как и вы не можете :)

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

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

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

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

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'
person Christian    schedule 31.08.2010
comment
PHP 5.x.x не поддерживает перегрузку, поэтому PHP не является полностью ООП. - person PHP Ferrari; 27.12.2010
comment
Дело не в том, что PHP не поддерживает перегрузку, а в том, что это не имеет смысла. Проблема связана с тем, что PHP использует динамические типы. Фактически, Javascript также не поддерживает перегрузку, и это все еще ООП. PHP не является полностью ООП-фудом только потому, что некоторые люди решили использовать контрольный список, чтобы судить, что ООП или нет. - person Christian; 28.12.2010
comment
@ ringø Нет, именованные функции в PHP неизменяемы. Создав именованную функцию в PHP, вы не сможете изменить ее внутреннее поведение (переопределение). Если вы не имели в виду переопределение метода, это что-то еще ... Вероятно, вам следует прочитать весь ответ, прежде чем комментировать первую строку. :) - person Christian; 28.11.2016
comment
@Christian Ну, конечно, в PHP (и многих других языках) происходит переопределение в классе. Итак, да, мы говорим о методах - даже если каждый из них имеет префикс ключевого слова function. Но на самом деле мне следовало сначала прочитать весь ответ ... - person Breaking not so bad; 28.11.2016

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

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);
person Community    schedule 03.12.2015
comment
Хорошая индивидуальная реализация, но она должна быть предоставлена ​​языком. - person 4EACH; 04.01.2017
comment
Это не метод, а не перегрузка функции, в то время как вы используете разные имена методов для каждого питомца. - person TomSawyer; 24.01.2017

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

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

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

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

f();

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

f(1);

вы получите еще одну функциональность (№2). Это эффект перегрузки - разные функции в зависимости от входных параметров функции.

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

person sbrbot    schedule 24.01.2013

Перегрузка метода происходит, когда два или более метода с одинаковым именем метода, но разным количеством параметров в одном классе. PHP не поддерживает перегрузку методов. Переопределение метода означает, что два метода с одинаковым именем метода и одинаковым количеством параметров в двух разных классах означают родительский класс и дочерний класс.

person Shriyash Deshmukh    schedule 19.06.2019

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

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

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

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

person Ram Iyer    schedule 14.05.2017

Между перегрузкой и переопределением функций есть некоторые различия, хотя обе функции содержат одно и то же имя. При перегрузке функции с одним и тем же именем содержат разные типы аргументов или возвращаемых типов; например: "function add (int a, int b)" & " function add (float a, float b); Здесь функция add () перегружена. В случае переопределения и аргумент, и имя функции совпадают. Обычно это встречается в наследовании или в чертах. Мы должны следовать некоторой тактике, чтобы ввести , какая функция будет выполняться сейчас.Поэтому при переопределении программист следует некоторой тактике для выполнения желаемой функции, когда при перегрузке программа может автоматически идентифицировать желаемую функцию ... Спасибо!

person Mashuq Tanmoy    schedule 23.01.2018

Перегрузка: в реальном мире перегрузка означает назначение кому-то лишних вещей. Как и в реальном мире, перегрузка в 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
person user3040433    schedule 07.07.2018

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

person PHP Ferrari    schedule 27.12.2010
comment
Я не знаю, откуда у вас возникла идея перегрузки требования для объектно-ориентированного программирования. - person drewish; 03.09.2011
comment
@drewish, потому что параметрический полиморфизм - одна из важнейших особенностей ООП? - person Davor; 16.05.2012
comment
@drewish, если вы считаете полиморфизм одной из основных стагнаций ООП. Тогда якобы существует перегрузка для компиляции. Однако перегрузка метода - это полиморфизм времени компиляции, также известный как статический полиморфизм. - person Yasir Arefin; 06.03.2014