Php'de fonksiyon aşırı yükleme ve geçersiz kılma nedir?


Yanıtlar:


192

Aşırı yükleme , benzer imzalara sahip ancak farklı parametrelere sahip işlevleri tanımlamaktır. Geçersiz kılma yalnızca, ana sınıfın bir yöntemi tanımladığı ve türetilmiş sınıfın bu yöntemi geçersiz kılmak istediği türetilmiş sınıflarla ilgilidir .

PHP'de, yöntemleri yalnızca sihirli yöntemi kullanarak aşırı yükleyebilirsiniz. __call .

Geçersiz kılma örneği :

<?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"
?>

31
PHP aşırı yüklemeyi desteklemiyor.
Sasha Chedygov

18
Evet kullanıyor, kullanıyor __call.
Jacob Relkin

50
PHP aşırı yüklemeyi isteğe bağlı parametrelerle değiştirir.
b01

3
İsteğe bağlı parametreler fikri için teşekkürler, bu gerçekten yardımcı bir ipucu
Fabricio PH

2
__call (), erişilemeyen yöntemler nesneler bağlamında çağrıldığında tetiklenir __callStatic () megic yöntemi, erişilemez yöntemler statik bağlamda çağrıldığında tetiklenir. PHP bağlamında Aşırı Yüklemenin daha ayrıntılı bir örneğini ve açıklamasını almak için bunu takip edin: PHP Aşırı Yükleme
Kod Buster

107

İşlev aşırı yükleme, aynı işlev adını farklı parametre kümelerini kullanarak iki kez (veya daha fazla) tanımladığınızda gerçekleşir. Örneğin:

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

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

Yukarıdaki örnekte, fonksiyon computeiki farklı parametre imzasıyla aşırı yüklenmiştir. * Bu henüz PHP'de desteklenmemektedir. Bir alternatif, isteğe bağlı bağımsız değişkenler kullanmaktır:

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

İşlev geçersiz kılma, bir sınıfı genişlettiğinizde ve ana sınıfta var olan bir işlevi yeniden yazdığınızda gerçekleşir:

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

Örneğin, computeiçinde belirtilen davranışı geçersiz kılar Addition.


9
PHP, AFAIK'te işlev aşırı yüklemesi desteklenmez. Ayrıca, alakasız bir yan not olarak, Subtractionsınıfınızı neden uzattığınızdan emin değilim Addition. :)
Sasha Chedygov

6
@musicfreak: Yerel saatle 00:40 ... Daha iyi bir örnek düşünemedim.
Andrew Moore

5
Bu henüz PHP'de desteklenmiyor ve PHP zayıf yazılmış bir dil olduğundan ve bu durumda hiçbir şey değişmeyeceği için muhtemelen desteklenmeyecek .
Crozin

2
Aşırı yükleme, yalnızca aynı işlev adını farklı parametreler kümesi kullanarak iki kez (veya daha fazla kez) tanımladığınızda değildir. Genel olarak, aşırı yükleme aynı işlev adını aynı sayıda parametreyi kullanarak ancak farklı türlerde iki kez (veya daha fazla kez) tanımladığınızda da olur. PHP'de değişken tür bildirimi olmadığından (Java'daki gibi) bu genelleme önemli değildir. Bundan tam olarak aşırı yüklemenin ne olduğu için bahsediyorum.
sbrbot

2
@sbrbot: Set hem sayı hem de tür anlamına gelir.
Andrew Moore

22

Açıkçası, hiçbir farkı yok, çünkü siz de yapamazsınız :)

İşlev geçersiz kılma APD gibi bir PHP uzantısı ile yapılabilirdi, ancak kullanımdan kaldırıldı ve afaik son sürümü kullanılamazdı.

Dinamik yazım nedeniyle PHP'de işlev aşırı yüklemesi yapılamaz, yani PHP'de değişkenleri belirli bir tür olarak "tanımlamazsınız". Misal:

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

Her değişken farklı bir türdendir, ancak çalıştırmadan önce türü bilebilirsiniz (4. olana bakın). Karşılaştırma olarak, diğer diller şunları kullanır:

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

Son örnekte, değişkenin türünü zorla ayarlamanız gerekir (örnek olarak, veri türü "bir şey" kullandım).


PHP'de işlev aşırı yüklemesinin neden mümkün olmadığı başka bir "sorun": PHP'nin func_get_args () adlı bir işlevi vardır ve bu işlev, bir dizi geçerli bağımsız değişken döndürür, şimdi aşağıdaki kodu göz önünde bulundurun:

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

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

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

Her iki işlevin de herhangi bir sayıda argüman kabul ettiğini düşünürsek, derleyici hangisini seçmelidir?


Son olarak, yukarıdaki yanıtların neden kısmen yanlış olduğunu belirtmek isterim; fonksiyon aşırı yükleme / geçersiz kılma yöntemi aşırı yükleme / geçersiz kılma ile aynı DEĞİLDİR .

Bir yöntemin bir işlev gibi, ancak bir sınıfa özgü olduğu durumlarda, bu durumda PHP, sınıflarda geçersiz kılmaya izin verir, ancak yine dil anlambiliminden dolayı aşırı yüklemeye izin vermez.

Sonuç olarak, Javascript gibi diller geçersiz kılmaya izin verir (ancak yine aşırı yükleme yoktur), ancak aynı zamanda bir kullanıcı işlevini geçersiz kılma ile bir yöntem arasındaki farkı da gösterebilir:

/// 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'

2
PHP 5.xx aşırı yüklemeyi desteklemez, bu yüzden PHP tamamen OOP değildir.
PHP Ferrari

30
PHP aşırı yüklemeyi desteklemiyor değil, mantıklı olamıyor. Sorun, dinamik türler kullanan PHP'den kaynaklanmaktadır. Aslında, Javascript aşırı yüklemeyi de desteklemiyor ve hala OOP. "PHP tam olarak OOP değildir" dolandırıcılığı sadece bazı insanlar OOP'nin neyin OOP olup olmadığına karar vermek için bir kontrol listesi kullanmaya karar vermesi nedeniyle mevcuttur.
Christian

@ ringø Hayır, PHP'de adlandırılmış işlevler değiştirilemez. PHP'de adlandırılmış bir işlev oluşturduğunuzda, onun iç davranışını değiştiremezsiniz (geçersiz kılma). Yöntemi geçersiz kılmayı kastetmediyseniz, ki bu başka bir şey .. İlk satıra yorum yapmadan önce muhtemelen tüm cevabı okumalısınız. :)
Christian

@Christian Tabii ki PHP'de (ve diğer birçok dilde) geçersiz kılma bir sınıfta gerçekleşir . Yani, evet, yöntemlerden bahsediyoruz - her birinin önüne anahtar kelime işlevi gelse bile . Ama aslında önce tüm cevabı okumalıydım ...
e2-e4

9

Aşırı Yükleme Örneği

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);

Güzel bir özel uygulama, ancak dil tarafından verilmelidir.
4'17

Her pupor için farklı yöntem adı kullanırken, bu yöntem değil, işlev aşırı yükleme
TomSawyer

5

Aşırı yükleme paradigması PHP tarafından tam olarak desteklenmese de, aynı (veya çok benzer) etki varsayılan parametrelerle (daha önce bahsettiğimiz gibi) elde edilebilir.

İşlevinizi şu şekilde tanımlarsanız:

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

Bu işlevi şöyle çağırdığınızda:

f();

bir işlev alırsınız (# 1), ancak bunu aşağıdaki gibi parametrelerle çağırırsanız:

f(1);

başka bir işlevsellik elde edeceksiniz (# 2). Bu, aşırı yüklemenin etkisidir - işlevin girdi parametrelerine bağlı olarak farklı işlevsellik.

Biliyorum, birisi şimdi bu işlevi f (0) olarak adlandırırsa hangi işlevselliği elde edeceğini soracaktır.


1

PHP'de Aşırı Yüklemenin diğer programlama dilleriyle karşılaştırıldığında tamamen farklı bir anlamı olduğunu burada belirtmek isterim. Pek çok insan PHP'de aşırı yüklemenin desteklenmediğini ve geleneksel aşırı yükleme tanımına göre, evet bu işlevselliğin açıkça mevcut olmadığını söyledi.

Bununla birlikte, PHP'de aşırı yüklemenin doğru tanımı tamamen farklıdır.

PHP'de aşırı yükleme, __set () ve __get () gibi sihirli yöntemler kullanarak özellikleri ve yöntemleri dinamik olarak oluşturmayı ifade eder. Bu aşırı yükleme yöntemleri, erişilebilir olmayan veya bildirilmemiş yöntemlerle veya özelliklerle etkileşimde bulunurken çağrılır.

İşte PHP kılavuzundan bir bağlantı: http://www.php.net/manual/en/language.oop5.overloading.php


1

Yöntem aşırı yükleme, aynı yöntem adına sahip ancak tek sınıfta farklı sayıda parametreye sahip iki veya daha fazla yöntem olduğunda oluşur. PHP, yöntem aşırı yüklemesini desteklemez. Yöntemi geçersiz kılma, iki farklı sınıfta aynı yöntem adına ve aynı sayıda parametrelere sahip iki yöntem anlamına gelir, ana sınıf ve alt sınıf anlamına gelir.


0

Her ikisi de aynı işlev adını içermesine rağmen, İşlev aşırı yükleme ve geçersiz kılma arasında bazı farklılıklar vardır. Aşırı yüklemede, aynı ad işlevleri arasında farklı türde bağımsız değişken veya dönüş türü bulunur; Örneğin: "işlev ekleme (int a, int b)" & " function add (float a, float b); Burada add () fonksiyonu aşırı yüklenmiştir.Hem argüman hem de fonksiyon adı aynıdır.Genellikle kalıtımda veya özelliklerde bulunur.Genelemek için bazı taktikler izlemeliyiz , şimdi hangi işlevi çalıştıracak? Yani, programcı, aşırı yüklemede programın istenen işlevi otomatik olarak tanımlayabildiği istenen işlevi yürütmek için bazı taktikler izler ... Teşekkürler!


0

Aşırı yükleme: Gerçek dünyada aşırı yükleme, birine fazladan bazı şeyler atamak anlamına gelir. Gerçek dünyada olduğu gibi PHP'de aşırı yükleme, ekstra işlevler çağırmak anlamına gelir. Başka bir şekilde farklı parametrelerle slimier işlevi olduğunu söyleyebilirsiniz. PHP'de __get, __set, __call vb. Sihirli işlevlerle aşırı yükleme kullanabilirsiniz.

Aşırı Yükleme Örneği:

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

Geçersiz kılma: Nesne yönelimli programlamada geçersiz kılma, alt sınıfta ana yöntemi değiştirmektir. Geçersiz kılma sırasında alt sınıfta ana sınıf yöntemini yeniden bildirebilirsiniz. Dolayısıyla, temelde geçersiz kılmanın amacı, ana sınıf yönteminizin davranışını değiştirmektir.

Geçersiz kılma örneği:

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

-14

PHP 5.xx aşırı yüklemeyi desteklemez, bu yüzden PHP tamamen OOP değildir.


18
Nesne Yönelimli Programlama için bir gereksinimi aşırı yükleme fikrini nereden edindiniz bilmiyorum.
drewish

6
@drewish parametrik polimorfizm OOP'nin en önemli özelliklerinden biri olduğu için?
Davor

1
Polimorfizmi OOP'nin ana durgunluklarından biri olarak sayarsanız @drewish. Öyleyse görünüşte aşırı yükleme derleme için oradadır. Ancak, yöntem aşırı yükleme, derleme zamanı polimorfizmidir ve ayrıca statik polimorfizm olarak da bilinir.
Yasir Arefin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.