Что вы подразумеваете в PHP под перегрузкой функций и переопределением функций. и в чем разница между ними обоими? не мог понять, в чем разница между ними.
Что такое перегрузка и переопределение функций в php?
Ответы (10)
Перегрузка - это определение функций, которые имеют похожие сигнатуры, но разные параметры. Переопределение применимо только к производным классам, где родительский класс определил метод, а производный класс желает переопределить этот метод.
В 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"
?>
__call.
- person Jacob Relkin; 08.06.2010
parent::myFoo(); внутри Bar- ›myFoo () вызывает Foo-› myFoo () в Bar.
- person Fandi Susanto; 20.04.2016
func_get_args() или func_num_args() не имеют абсолютно ничего общего с перегрузкой. Настоящая перегрузка означает, что вы можете объявить myFunc(\DateTime $foo) и myFunc(\Vendor\Package\Model $bar, int $baz), которые ведут себя совершенно по-разному. Перегрузка означает наличие разных типов (и, возможно, также другого количества) аргументов и другой реализации.
- person Foo Bar; 29.08.2017
Перегрузка функции происходит, когда вы определяете одно и то же имя функции дважды (или более) с использованием разных наборов параметров. Например:
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.
Subtraction расширял класс Addition. :)
- person Sasha Chedygov; 08.06.2010
Строго говоря, разницы нет, так как и вы не можете :)
Переопределение функции могло быть выполнено с помощью расширения 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 совершенно иное.
В PHP перегрузка означает динамическое создание свойств и методов с использованием магических методов, таких как __set () и __get (). Эти методы перегрузки вызываются при взаимодействии с методами или свойствами, которые недоступны или не объявлены.
Вот ссылка на руководство по PHP: http://www.php.net/manual/en/language.oop5.overloading.php
Между перегрузкой и переопределением функций есть некоторые различия, хотя обе функции содержат одно и то же имя. При перегрузке функции с одним и тем же именем содержат разные типы аргументов или возвращаемых типов; например: "function add (int a, int b)" & " function add (float a, float b); Здесь функция add () перегружена. В случае переопределения и аргумент, и имя функции совпадают. Обычно это встречается в наследовании или в чертах. Мы должны следовать некоторой тактике, чтобы ввести , какая функция будет выполняться сейчас.Поэтому при переопределении программист следует некоторой тактике для выполнения желаемой функции, когда при перегрузке программа может автоматически идентифицировать желаемую функцию ... Спасибо!
Перегрузка: в реальном мире перегрузка означает назначение кому-то лишних вещей. Как и в реальном мире, перегрузка в 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
PHP 5.x.x не поддерживает перегрузку, поэтому PHP не является полностью ООП.