2010-06-08 3 views
114

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

+0

Вы можете использовать Перегружаемый класс в этой ссылке: http://stackoverflow.com/questions/4697705/php-function-overloading/27231803#27231803 –

ответ

168

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

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

PHP не поддерживает перегрузку, хотя. –

+17

Да, это делает, используя '__call'. –

+90

Это называется патчем обезьяны ... Поддержка через хак ... –

93

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

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.

+7

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

+6

@musicfreak: 12:40 по местному времени ... Не мог придумать лучшего примера. –

+0

Не беспокойтесь, я просто дразня.) –

20

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

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

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

+27

Это не значит, что PHP не поддерживает перегрузку, это значит, что это не имеет смысла. Проблема связана с PHP с использованием динамических типов. На самом деле, Javascript не поддерживает перегрузку, и он по-прежнему является ООП. «PHP не является полностью OOP» fud существует только потому, что некоторые люди решили использовать контрольный список, чтобы судить о том, что такое ООП или нет. – Christian

+1

Очень очень подробно ... Thanx ... –

-13

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

+17

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

+6

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

+1

Он копирует вставку из предыдущих комментариев ответа. – Sahal

5

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

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

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

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

f(); 

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

f(1); 

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

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

8

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

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

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

+0

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

0

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

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

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

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^