Что такое перегрузка и переопределение функций в php? - PullRequest
126 голосов
/ 08 июня 2010

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

Ответы [ 10 ]

187 голосов
/ 08 июня 2010

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

В 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"
?>
103 голосов
/ 08 июня 2010

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

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.

22 голосов
/ 31 августа 2010

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

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

Перегрузка функций в 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'
9 голосов
/ 03 декабря 2015

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

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);
5 голосов
/ 24 января 2013

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

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

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

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

f();

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

f(1);

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

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

1 голос
/ 14 мая 2017

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

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

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

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

0 голосов
/ 19 июня 2019

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

0 голосов
/ 07 июля 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
0 голосов
/ 23 января 2018

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

0 голосов
/ 27 декабря 2010

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

...