PHP'de, işlev aşırı yükleme ve işlev geçersiz kılma ile ne demek istiyorsunuz? ve ikisi arasındaki fark nedir? aralarındaki farkın ne olduğunu anlayamadım.
PHP'de, işlev aşırı yükleme ve işlev geçersiz kılma ile ne demek istiyorsunuz? ve ikisi arasındaki fark nedir? aralarındaki farkın ne olduğunu anlayamadım.
Yanıtlar:
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"
?>
__call
.
İş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 compute
iki 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, compute
içinde belirtilen davranışı geçersiz kılar Addition
.
Subtraction
sınıfınızı neden uzattığınızdan emin değilim Addition
. :)
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'
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);
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.
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
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.
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!
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
PHP 5.xx aşırı yüklemeyi desteklemez, bu yüzden PHP tamamen OOP değildir.