Що таке перевантаження та перезавантаження функції в php?


130

Під PHP, що ви маєте на увазі під перевантаженням функцій та перезавантаженням функції. і яка різниця між ними обома? не вдалося зрозуміти, у чому різниця між ними.


Ви можете використовувати клас для завантаження за цим посиланням: stackoverflow.com/questions/4697705/php-function-overloading/…
Hisham Dalal

Відповіді:


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 не підтримує перевантаження.
Саша Чедигов

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клас. :)
Саша Чедигов

6
@musicfreak: 00:40 за місцевим часом ... Не можу придумати кращого прикладу.
Ендрю Мур

5
Це ще не підтримується в PHP і, ймовірно, ніколи не буде, оскільки PHP є слабо набраною мовою, і нічого в цьому випадку не зміниться.
Крозін

2
Перевантаження не є лише тоді, коли ви визначаєте одне і те саме ім'я функції двічі (або більше разів), використовуючи різні набори параметрів. Як правило, перевантаження також відбувається, коли ви визначаєте одне і те саме ім'я функції двічі (або більше разів), використовуючи однакову кількість параметрів, але різних типів. Оскільки в PHP немає декларації змінних типів (як у Java), це узагальнення значення не має. Я лише згадую це заради точності, що таке перевантаження.
sbrbot

2
@sbrbot: Набір означає кількість і типи.
Ендрю Мур

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 не є повністю OOP.
PHP Ferrari

30
Справа не в тому, що PHP не підтримує перевантаження, це не може мати сенсу. Проблема пов'язана з тим, що PHP використовує динамічні типи. Насправді, і JavaScript не підтримує перевантаження, і це все ще OOP. Фуд "PHP не повністю OOP" існує лише тому, що деякі люди вирішили використовувати контрольний список, щоб оцінити, що таке OOP чи ні.
Крістіан

@ ringø Nope, названі функції в PHP незмінні. Після створення іменованої функції в PHP, ви не можете змінити її внутрішню поведінку (переосмислення). Якщо ви не мали на увазі переосмислення методу, який є чимось іншим. Ви, ймовірно, повинні прочитати всю відповідь, перш ніж коментувати перший рядок. :)
Крістіан

@Christian Ну, звичайно, в PHP (і багатьох інших мовах) переосмислення відбувається в класі . Отже, так, ми говоримо про методи - хоча кожен з них має префікс функції ключового слова . Але справді я мав би прочитати всю відповідь спочатку ...
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);

Хороша спеціальна реалізація, але вона повинна надаватися мовою.
4КРАЯ

Це не метод, перевантаження функцій, тоді як ви використовуєте іншу назву методу для кожної пупори
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

Існують деякі відмінності між перевантаженням та перезавантаженням функцій, хоча обидві містять однакову назву функції. При перевантаженні між однойменними функціями містяться різні типи аргументів або тип повернення; такі як: "функція add (int a, int b)" & " функція 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 не є повністю OOP.


18
Я не знаю, звідки у вас ідея про перевантаження вимоги для об'єктно-орієнтованого програмування.
drewish

6
@drewish, тому що параметричний поліморфізм є однією з найважливіших особливостей ООП?
Давор

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