Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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.

Ответ 3

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

Функция переопределения могла быть выполнена с расширением 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');
  }
}
a.a=function(){
   alert('b');
}

a.a(); // shows popup with 'b'

Ответ 4

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

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

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

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

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

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

f();

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

f(1);

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

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

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

Ответ 10

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