Что вы подразумеваете в PHP под перегрузкой функций и переопределением функций. и в чем разница между ними обоими? не мог понять, в чем разница между ними.
Что вы подразумеваете в PHP под перегрузкой функций и переопределением функций. и в чем разница между ними обоими? не мог понять, в чем разница между ними.
Ответы:
Перегрузка - это определение функций, которые имеют похожие сигнатуры, но разные параметры. Переопределение применимо только к производным классам, где родительский класс определил метод, а производный класс желает переопределить этот метод.
В 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
.
Перегрузка функции происходит, когда вы определяете одно и то же имя функции дважды (или более) с использованием разных наборов параметров. Например:
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
класс. :)
Строго говоря, разницы нет, так как и вы не можете :)
Переопределение функции могло быть выполнено с помощью расширения 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
Перегрузка метода происходит, когда два или более метода с одинаковым именем метода, но разным количеством параметров в одном классе. 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.xx не поддерживает перегрузку, поэтому PHP не является полностью ООП.