¿Qué es la sobrecarga y anulación de funciones en php?

Respuestas:

192

La sobrecarga es definir funciones que tienen firmas similares, pero que tienen parámetros diferentes. La anulación solo es pertinente para las clases derivadas, donde la clase principal ha definido un método y la clase derivada desea anular ese método.

En PHP, solo puedes sobrecargar métodos usando el método mágico __call.

Un ejemplo de anulación :

<?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"
?>
Jacob Relkin
fuente
31
Sin embargo, PHP no admite sobrecarga.
Sasha Chedygov
18
Sí lo hace, usando __call.
Jacob Relkin
50
PHP sustituye la sobrecarga a través de parámetros opcionales.
b01
3
Gracias por la idea de parámetros opcionales, es una pista realmente útil
Fabricio PH
2
__call () se activa cuando se invocan métodos inaccesibles en el contexto de los objetos. __callStatic () el método megic se activa cuando se invocan métodos inaccesibles en un contexto estático. Siga esto para obtener un ejemplo más detallado y una explicación de la sobrecarga en el contexto de PHP
Code Buster
107

La sobrecarga de funciones ocurre cuando define el mismo nombre de función dos veces (o más) usando un conjunto diferente de parámetros. Por ejemplo:

class Addition {
  function compute($first, $second) {
    return $first+$second;
  }

  function compute($first, $second, $third) {
    return $first+$second+$third;
  }
}

En el ejemplo anterior, la función computeestá sobrecargada con dos firmas de parámetros diferentes. * Esto aún no es compatible con PHP. Una alternativa es usar argumentos opcionales:

class Addition {
  function compute($first, $second, $third = 0) {
    return $first+$second+$third;
  }
}

La anulación de funciones ocurre cuando extiende una clase y reescribe una función que existía en la clase primaria:

class Substraction extends Addition {
  function compute($first, $second, $third = 0) {
    return $first-$second-$third;
  }
}

Por ejemplo, computeanula el comportamiento establecido en Addition.

Andrew Moore
fuente
9
Excepto que la sobrecarga de funciones no es compatible con PHP, AFAIK. Además, como nota al margen no relacionada, no estoy seguro de por qué una Subtractionclase ampliaría la Additionclase. :)
Sasha Chedygov
66
@musicfreak: 12:40 AM hora local ... No podría pensar en un mejor ejemplo.
Andrew Moore
55
Esto aún no es compatible con PHP y probablemente nunca lo será, ya que PHP es un lenguaje débilmente tipado y nada va a cambiar en este caso.
Crozin
2
La sobrecarga no es solo cuando define el mismo nombre de función dos veces (o más veces) usando un conjunto diferente de parámetros. En general, la sobrecarga también es cuando define el mismo nombre de función dos veces (o más veces) usando el mismo número de parámetros pero de diferentes tipos. Como en PHP no hay declaración de tipo variable (como en Java), esta generalización no importa. Solo estoy mencionando esto, en aras de la precisión, qué es la sobrecarga.
sbrbot
2
@sbrbot: Set implica número y tipos.
Andrew Moore
22

Estrictamente hablando, no hay diferencia, ya que tampoco puedes hacerlo :)

La anulación de funciones podría haberse realizado con una extensión PHP como APD, pero está en desuso y la última versión de afaik no se podía usar.

La sobrecarga de funciones en PHP no se puede realizar debido a la tipificación dinámica, es decir, en PHP no "define" las variables para que sean de un tipo en particular. Ejemplo:

$a=1;
$a='1';
$a=true;
$a=doSomething();

Cada variable es de un tipo diferente, sin embargo, puede conocer el tipo antes de la ejecución (consulte la cuarta). Como comparación, otros idiomas usan:

int a=1;
String s="1";
bool a=true;
something a=doSomething();

En el último ejemplo, debe establecer con fuerza el tipo de variable (como ejemplo, usé el tipo de datos "algo").


Otro "problema" por el que la sobrecarga de funciones no es posible en PHP: PHP tiene una función llamada func_get_args (), que devuelve una matriz de argumentos actuales, ahora considere el siguiente código:

function hello($a){
  print_r(func_get_args());
}

function hello($a,$a){
  print_r(func_get_args());
}

hello('a');
hello('a','b');

Considerando que ambas funciones aceptan cualquier cantidad de argumentos, ¿cuál debería elegir el compilador?


Finalmente, me gustaría señalar por qué las respuestas anteriores son parcialmente incorrectas; la sobrecarga / anulación de la función NO es igual a la sobrecarga / anulación del método .

Cuando un método es como una función pero específico de una clase, en cuyo caso, PHP permite anular en las clases, pero nuevamente no sobrecargar, debido a la semántica del lenguaje.

Para concluir, los lenguajes como Javascript permiten anular (pero de nuevo, no sobrecargar), sin embargo, también pueden mostrar la diferencia entre anular una función de usuario y un método:

/// 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'
cristiano
fuente
2
PHP 5.xx no admite sobrecarga, por eso PHP no es completamente OOP.
PHP Ferrari
30
No es que PHP no admita la sobrecarga, es que no puede tener sentido. El problema se debe a que PHP usa tipos dinámicos. De hecho, Javascript tampoco admite la sobrecarga, y sigue siendo POO. El fud "PHP no es completamente OOP" solo existe porque algunas personas decidieron usar una lista de verificación para juzgar qué es OOP o no.
Christian
@ ringø No, las funciones con nombre en PHP son inmutables. Una vez que crea una función con nombre en PHP, no hay forma de que pueda modificar su comportamiento interno (anulación). A menos que quisieras anular el método, que es otra cosa ... Probablemente deberías leer la respuesta completa antes de comentar en la primera línea. :)
Christian
@Christian Bueno, por supuesto, en PHP (y en muchos otros idiomas) la anulación ocurre en una clase . Entonces, sí, estamos hablando de métodos, a pesar de que cada uno de ellos tiene el prefijo de la función de palabra clave . Pero, de hecho, debería haber leído toda la respuesta primero ...
e2-e4
9

Ejemplo de sobrecarga

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);
Caminar
fuente
Buena implementación personalizada, pero debe ser dada por el idioma.
4CADA
Este no es un método, una sobrecarga de funciones, mientras usa un nombre de método diferente para cada alumno
TomSawyer
5

Aunque el paradigma de sobrecarga no es totalmente compatible con PHP, se puede lograr el mismo efecto (o muy similar) con los parámetros predeterminados (como alguien mencionó anteriormente).

Si define su función de esta manera:

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

Cuando llamas a esta función como:

f();

obtendrá una funcionalidad (# 1), pero si la llama con parámetros como:

f(1);

Obtendrá otra funcionalidad (# 2). Ese es el efecto de la sobrecarga: una funcionalidad diferente según los parámetros de entrada de la función.

Lo sé, alguien preguntará ahora qué funcionalidad obtendrá uno si llama a esta función como f (0).

sbrbot
fuente
1

Me gustaría señalar aquí que la sobrecarga en PHP tiene un significado completamente diferente en comparación con otros lenguajes de programación. Mucha gente ha dicho que la sobrecarga no es compatible con PHP y, según la definición convencional de sobrecarga, sí, esa funcionalidad no está explícitamente disponible.

Sin embargo, la definición correcta de sobrecarga en PHP es completamente diferente.

En PHP, la sobrecarga se refiere a la creación dinámica de propiedades y métodos utilizando métodos mágicos como __set () y __get (). Estos métodos de sobrecarga se invocan al interactuar con métodos o propiedades que no son accesibles o no se declaran.

Aquí hay un enlace del manual de PHP: http://www.php.net/manual/en/language.oop5.overloading.php

Ram Iyer
fuente
1

La sobrecarga de métodos ocurre cuando dos o más métodos con el mismo nombre de método pero diferente número de parámetros en una sola clase. PHP no admite la sobrecarga de métodos. La anulación de métodos significa dos métodos con el mismo nombre de método y el mismo número de parámetros en dos clases diferentes significa clase primaria y clase secundaria.

Shriyash Deshmukh
fuente
0

Hay algunas diferencias entre la sobrecarga y la anulación de funciones, aunque ambas contienen el mismo nombre de función. En sobrecarga, entre las mismas funciones de nombre contienen diferentes tipos de argumento o tipo de retorno; tales como: "function add (int a, int b)" & " función add (float a, float b); aquí la función add () está sobrecargada. En el caso de anular tanto el argumento como el nombre de la función son los mismos. Generalmente se encuentra en herencia o en rasgos. Tenemos que seguir algunas tácticas para introducir , qué función se ejecutará ahora. Entonces, al anular el programador, se siguen algunas tácticas para ejecutar la función deseada, donde en la sobrecarga el programa puede identificar automáticamente la función deseada ... ¡Gracias!

Mashuq Tanmoy
fuente
0

Sobrecarga: en el mundo real, la sobrecarga significa asignar algunas cosas adicionales a alguien. Como en el mundo real, la sobrecarga en PHP significa llamar a funciones adicionales. De otra manera, puede decir que tiene una función más delgada con diferentes parámetros. En PHP puede usar la sobrecarga con funciones mágicas, por ejemplo, __get, __set, __call, etc.

Ejemplo de sobrecarga:

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

Anulación: en la programación orientada a objetos, la anulación es reemplazar el método principal en la clase secundaria. En la anulación, puede volver a declarar el método de la clase primaria en la clase secundaria. Entonces, básicamente, el propósito de anular es cambiar el comportamiento de su método de clase padre.

Ejemplo de anulación:

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
usuario3040433
fuente
-14

PHP 5.xx no admite sobrecarga, por eso PHP no es completamente OOP.

PHP Ferrari
fuente
18
No sé de dónde sacaste la idea de sobrecargar un requisito para la Programación Orientada a Objetos.
empalagoso
66
@drewish porque el polimorfismo paramétrico es una de las características más importantes de OOP?
Davor
1
@drewish si cuentas el polimorfismo como uno de los principales estancamientos de OOP. Entonces la sobrecarga aparentemente está ahí fuera para la compilación. Sin embargo, la sobrecarga de métodos es el polimorfismo en tiempo de compilación y también conocido como polimorfismo estático.
Yasir Arefin