Dalam PHP, apa yang Anda maksud dengan overloading fungsi dan overriding fungsi. dan apa perbedaan keduanya? tidak bisa mencari tahu apa perbedaan di antara mereka.
Dalam PHP, apa yang Anda maksud dengan overloading fungsi dan overriding fungsi. dan apa perbedaan keduanya? tidak bisa mencari tahu apa perbedaan di antara mereka.
Jawaban:
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"
?>
__call
.
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 compute
kelebihan 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, compute
menimpa perilaku yang ditetapkan dalam Addition
.
Subtraction
kelas memperpanjang Addition
kelas. :)
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'
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);
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).
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
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.
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!
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
PHP 5.xx tidak mendukung kelebihan beban inilah sebabnya PHP tidak sepenuhnya OOP.