Apa fungsi overloading dan overriding di php?

Jawaban:

192

Overloading adalah mendefinisikan fungsi yang memiliki tanda tangan yang serupa, namun memiliki parameter yang berbeda. Overriding hanya berkaitan dengan kelas turunan, di mana kelas induk telah mendefinisikan metode dan kelas turunan ingin menimpa metode itu.

Di PHP, Anda hanya bisa membebani metode menggunakan metode ajaib __call.

Contoh penimpaan :

<?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
sumber
31
PHP tidak mendukung overloading.
Sasha Chedygov
18
Ya, menggunakan __call.
Jacob Relkin
50
Pengganti PHP kelebihan beban melalui parameter opsional.
B01
3
Terima kasih atas gagasan parameter opsional, Ini petunjuk yang sangat membantu
Fabricio PH
2
__call () dipicu ketika metode yang tidak dapat diakses dipanggil dalam konteks objek __callStatic () metode megic dipicu ketika metode yang tidak dapat diakses dipanggil dalam konteks statis. Ikuti ini untuk mendapatkan contoh dan penjelasan yang lebih rinci tentang Overloading dalam konteks PHP
Code Buster
107

Kelebihan fungsi terjadi ketika Anda menetapkan nama fungsi yang sama dua kali (atau lebih) menggunakan serangkaian parameter yang berbeda. Sebagai contoh:

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

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

Pada contoh di atas, fungsinya computekelebihan beban dengan dua tanda tangan parameter yang berbeda. * Ini belum didukung di PHP. Alternatifnya adalah dengan menggunakan argumen opsional:

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

Fungsi penimpaan terjadi ketika Anda memperluas kelas dan menulis ulang fungsi yang ada di kelas induk:

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

Misalnya, computemenimpa perilaku yang ditetapkan dalam Addition.

Andrew Moore
sumber
9
Kecuali kelebihan fungsi tidak didukung dalam PHP, AFAIK. Juga, sebagai catatan tambahan yang tidak terkait, saya tidak yakin mengapa Anda ingin Subtractionkelas memperpanjang Additionkelas. :)
Sasha Chedygov
6
@musicfreak: 12:40 waktu setempat ... Tidak dapat memikirkan contoh yang lebih baik.
Andrew Moore
5
Ini belum didukung dalam PHP dan mungkin tidak akan pernah, karena PHP adalah bahasa yang diketik dengan lemah dan tidak ada yang akan berubah dalam kasus ini.
Crozin
2
Kelebihan tidak hanya ketika Anda mendefinisikan nama fungsi yang sama dua kali (atau lebih banyak kali) menggunakan serangkaian parameter yang berbeda. Secara umum, kelebihan beban juga ketika Anda mendefinisikan nama fungsi yang sama dua kali (atau lebih banyak kali) menggunakan jumlah parameter yang sama tetapi dari jenis yang berbeda. Karena di PHP tidak ada deklarasi tipe variabel (seperti di Jawa) generalisasi ini tidak masalah. Saya hanya menyebutkan ini demi ketepatan apa kelebihan itu.
sbrbot
2
@sbrbot: Set menyiratkan angka dan tipe.
Andrew Moore
22

Sebenarnya, tidak ada perbedaan, karena Anda tidak dapat melakukan keduanya :)

Fungsi overriding bisa dilakukan dengan ekstensi PHP seperti APD, tetapi sudah usang dan afaik versi terakhir tidak dapat digunakan.

Fungsi overloading di PHP tidak dapat dilakukan karena pengetikan dinamis, yaitu, dalam PHP Anda tidak "mendefinisikan" variabel menjadi tipe tertentu. Contoh:

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

Setiap variabel memiliki tipe yang berbeda, namun Anda dapat mengetahui jenisnya sebelum dieksekusi (lihat yang keempat). Sebagai perbandingan, bahasa lain menggunakan:

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

Dalam contoh terakhir, Anda harus secara paksa mengatur tipe variabel (sebagai contoh, saya menggunakan tipe data "sesuatu").


"Masalah" lain mengapa kelebihan fungsi tidak dimungkinkan dalam PHP: PHP memiliki fungsi yang disebut func_get_args (), yang mengembalikan array argumen saat ini, sekarang pertimbangkan kode berikut:

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

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

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

Mempertimbangkan kedua fungsi menerima sejumlah argumen, mana yang harus dipilih oleh kompiler?


Akhirnya, saya ingin menunjukkan mengapa jawaban di atas sebagian salah; fungsi overloading / overriding TIDAK sama dengan metode overloading / overriding.

Di mana metode seperti fungsi tetapi khusus untuk kelas, dalam hal ini, PHP mengizinkan overriding di kelas, tetapi sekali lagi tidak ada overloading, karena bahasa semantik.

Untuk menyimpulkan, bahasa seperti Javascript memungkinkan penggantian (tapi sekali lagi, tidak ada pembebanan berlebihan), namun mereka juga dapat menunjukkan perbedaan antara menimpa fungsi pengguna dan metode:

/// 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'
Kristen
sumber
2
PHP 5.xx tidak mendukung kelebihan beban inilah sebabnya PHP tidak sepenuhnya OOP.
PHP Ferrari
30
Bukannya PHP tidak mendukung overloading, tapi itu tidak masuk akal. Masalahnya adalah karena PHP menggunakan tipe dinamis. Bahkan, Javascript juga tidak mendukung overloading, dan itu masih OOP. Fud "PHP tidak sepenuhnya OOP" hanya ada karena beberapa orang memutuskan untuk menggunakan daftar periksa untuk menilai apa OOP atau tidak.
Christian
@ ringø Tidak, fungsi yang disebutkan dalam PHP tidak dapat diubah. Setelah Anda membuat fungsi bernama di PHP, tidak ada cara Anda dapat mengubah perilaku internalnya (overriding). Kecuali Anda bermaksud mengganti metode, yang merupakan hal lain .. Anda mungkin harus membaca seluruh jawaban sebelum mengomentari baris pertama. :)
Christian
@Christian Yah, tentu saja dalam PHP (dan banyak bahasa lainnya) overriding terjadi di kelas . Jadi, ya, kita berbicara tentang metode - meskipun masing-masing diawali dengan fungsi kata kunci . Tetapi memang saya harus membaca seluruh jawaban terlebih dahulu ...
e2-e4
9

Contoh overloading

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);
Berjalan
sumber
Implementasi kustom yang bagus, tetapi harus diberikan oleh bahasa.
SETIAP
Ini bukan metode, fungsi kelebihan beban, saat Anda menggunakan nama metode yang berbeda untuk setiap anak anjing
TomSawyer
5

Meskipun paradigma overloading tidak sepenuhnya didukung oleh PHP, efek yang sama (atau sangat mirip) dapat dicapai dengan parameter default (seperti yang disebutkan sebelumnya).

Jika Anda mendefinisikan fungsi Anda seperti ini:

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

Ketika Anda memanggil fungsi ini seperti:

f();

Anda akan mendapatkan satu fungsionalitas (# 1), tetapi jika Anda menyebutnya dengan parameter seperti:

f(1);

Anda akan mendapatkan fungsionalitas lain (# 2). Itulah efek kelebihan beban - fungsionalitas yang berbeda tergantung pada parameter input fungsi.

Saya tahu, seseorang akan bertanya sekarang apa fungsi yang akan didapat jika dia memanggil fungsi ini sebagai f (0).

sbrbot
sumber
1

Saya ingin menunjukkan di sini bahwa Overloading di PHP memiliki arti yang sangat berbeda dibandingkan dengan bahasa pemrograman lainnya. Banyak orang mengatakan bahwa overloading tidak didukung dalam PHP dan oleh definisi konvensional overloading, ya fungsionalitas itu tidak tersedia secara eksplisit.

Namun, definisi overloading yang benar dalam PHP benar-benar berbeda.

Dalam PHP overloading mengacu pada pembuatan properti dan metode secara dinamis menggunakan metode ajaib seperti __set () dan __get (). Metode kelebihan ini dipanggil ketika berinteraksi dengan metode atau properti yang tidak dapat diakses atau tidak dideklarasikan.

Berikut ini tautan dari manual PHP: http://www.php.net/manual/en/language.oop5.overloading.php

Ram Iyer
sumber
1

Metode overloading terjadi ketika dua metode atau lebih dengan nama metode yang sama tetapi jumlah parameter yang berbeda dalam satu kelas. PHP tidak mendukung kelebihan metode. Metode overriding berarti dua metode dengan nama metode yang sama dan jumlah parameter yang sama di dua kelas yang berbeda berarti kelas induk dan kelas anak.

Shriyash Deshmukh
sumber
0

Ada beberapa perbedaan antara Fungsi overloading & overriding meskipun keduanya berisi nama fungsi yang sama. Dalam overloading, antara fungsi nama yang sama mengandung berbagai jenis argumen atau tipe pengembalian; Seperti: "function add (int a, int b)" & " fungsi add (float a, float b); Di sini fungsi add () kelebihan beban. Dalam kasus mengesampingkan baik argumen dan fungsi fungsinya sama. Umumnya ditemukan dalam warisan atau dalam sifat. Kita harus mengikuti beberapa taktik untuk memperkenalkan , fungsi apa yang akan dieksekusi sekarang. Jadi, dalam meng-override programmer mengikuti beberapa taktik untuk mengeksekusi fungsi yang diinginkan dimana dalam overloading program dapat secara otomatis mengidentifikasi fungsi yang diinginkan ... Terima kasih!

Mashuq Tanmoy
sumber
0

Overloading: Di dunia nyata, overloading berarti memberikan beberapa hal tambahan kepada seseorang. Seperti di dunia nyata Kelebihan beban dalam PHP berarti memanggil fungsi tambahan. Dengan cara lain Anda dapat mengatakan itu memiliki fungsi yang lebih ramping dengan parameter yang berbeda. Dalam PHP Anda dapat menggunakan kelebihan dengan fungsi ajaib misalnya __gget, __set, __call dll.

Contoh Kelebihan Beban:

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

Mengesampingkan: Dalam mengesampingkan pemrograman berorientasi objek adalah untuk menggantikan metode induk di kelas anak. Dalam mengesampingkan Anda dapat mendeklarasikan ulang metode kelas induk di kelas anak. Jadi, pada dasarnya tujuan dari mengganti adalah untuk mengubah perilaku metode kelas induk Anda.

Contoh penimpaan:

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
pengguna3040433
sumber
-14

PHP 5.xx tidak mendukung kelebihan beban inilah sebabnya PHP tidak sepenuhnya OOP.

PHP Ferrari
sumber
18
Saya tidak tahu dari mana Anda mendapat ide bahwa kelebihan persyaratan untuk Pemrograman Berorientasi Objek.
drewish
6
@ jelek karena polimorfisme parametrik adalah salah satu fitur terpenting dari OOP?
Davor
1
@ jelek jika Anda menghitung polimorfisme sebagai salah satu stagnasi utama OOP. Kemudian seolah-olah ada kelebihan beban di luar sana untuk kompilasi. Namun, metode overloading adalah waktu kompilasi polimorfisme dan juga dikenal sebagai polimorfisme statis.
Yasir Arefin