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


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

9 122

9 ответов:

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

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

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

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.

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

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

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

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

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

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

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

при вызове этой функции как:

f();

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

f(1);

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

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

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

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

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

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

есть некоторые различия между перегрузкой и переопределением функций, хотя оба содержат одну и ту же функцию name.In перегрузка, между тем же именем функции содержат другой тип аргумента или возвращаемого типа;например: "добавить функцию (в инт,инт б)" & "добавить функцию(плавать,поплавок б); Здесь функция add () перегружена. В случае переопределения как аргумент, так и имя функции являются same.It обычно встречается в наследственности или в чертах характера.Мы должны следовать некоторой тактике, чтобы ввести, какую функцию будет выполнять сейчас. Таким образом, при переопределении программист следует некоторой тактике для выполнения желаемой функции, где при перегрузке программа может автоматически идентифицировать желаемую функцию...Спасибо!

перегрузка: в реальном мире перегрузка означает назначение кому-то дополнительных вещей. Как в реальном мире, перегрузка в PHP означает вызов дополнительных функций. Другими словами, вы можете сказать, что у него есть более тонкая функция с разными parameter.In 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.In переопределение можно повторно объявить метод родительского класса в дочернем классе. Таким образом, в основном целью переопределения является изменение поведения метода родительского класса.

пример переопределение :

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

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