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


130

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


Вы можете использовать перегружаемый класс по этой ссылке: stackoverflow.com/questions/4697705/php-function-overloading/…
Хишам Далал

Ответы:


192

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

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

31
Однако PHP не поддерживает перегрузку.
Саша Чедыгов 08

18
Да, используется __call.
Джейкоб Релкин

50
PHP заменяет перегрузку необязательными параметрами.
b01

3
Спасибо за идею необязательных параметров, это действительно полезный совет
Fabricio PH

2
__call () запускается, когда недоступные методы вызываются в контексте объекта. __callStatic () мегатод запускается, когда недоступные методы вызываются в статическом контексте. Следуйте этому, чтобы получить более подробный пример и объяснение перегрузки в контексте PHP
Code Buster

107

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

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.


9
За исключением того, что перегрузка функций не поддерживается в PHP, AFAIK. Кроме того, в качестве несвязанного побочного примечания, я не уверен, почему вам нужен Subtractionкласс, расширяющий Additionкласс. :)
Саша Чедыгов 08

6
@musicfreak: 00:40 по местному времени ... Не могу придумать лучшего примера.
Эндрю Мур

5
Это пока не поддерживается в PHP и, вероятно, никогда не будет, поскольку PHP - язык со слабой типизацией, и в этом случае ничего не изменится.
Crozin

2
Перегрузка возникает не только тогда, когда вы определяете одно и то же имя функции дважды (или более раз), используя другой набор параметров. Как правило, перегрузка также возникает, когда вы определяете одно и то же имя функции дважды (или более раз), используя одно и то же количество параметров, но разных типов. Поскольку в PHP нет объявления типа переменной (как в Java), это обобщение не имеет значения. Я просто говорю об этом для точности, что такое перегрузка.
sbrbot

2
@sbrbot: Set подразумевает как количество, так и типы.
Эндрю Мур

22

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

Переопределение функции могло быть выполнено с помощью расширения 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'

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

30
Дело не в том, что PHP не поддерживает перегрузку, а в том, что это не имеет смысла. Проблема связана с тем, что PHP использует динамические типы. Фактически, Javascript также не поддерживает перегрузку, и это все еще ООП. Заблуждение «PHP не является полностью ООП» существует только потому, что некоторые люди решили использовать контрольный список, чтобы судить, что ООП или нет.
Кристиан

@ ringø Нет, именованные функции в PHP неизменяемы. Создав именованную функцию в PHP, вы не сможете изменить ее внутреннее поведение (переопределение). Если вы не имели в виду переопределение метода, это что-то еще ... Вероятно, вам следует прочитать весь ответ, прежде чем комментировать первую строку. :)
Christian

@Christian Ну, конечно, в PHP (и во многих других языках) переопределение происходит в классе . Итак, да, мы говорим о методах - даже если каждый из них имеет префикс с ключевым словом function . Но на самом деле я должен был сначала прочитать весь ответ ...
e2-e4

9

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

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);

Хорошая индивидуальная реализация, но она должна быть предоставлена ​​языком.
4EACH

Это не метод, а не перегрузка функции, в то время как вы используете разные имена методов для каждого ученика
TomSawyer

5

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

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

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

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

f();

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

f(1);

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

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


1

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

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

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

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


1

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


0

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


0

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

-14

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


18
Я не знаю, откуда у вас возникла идея перегрузки требования для объектно-ориентированного программирования.
нарисовал 02

6
@drewish, потому что параметрический полиморфизм - одна из самых важных особенностей ООП?
Давор

1
@drewish, если вы считаете полиморфизм одной из основных стагнаций ООП. Тогда якобы существует перегрузка для компиляции. Однако перегрузка метода - это полиморфизм времени компиляции, также известный как статический полиморфизм.
Ясир Арефин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.