PHP aşırı yükleme gibi bir şey?

3 Cevap php

Ben böyle bir şey başarmak istiyorum: bir yöntemini çağırın, "turnScrewdriver kullanan bir" tornavida "nesne / param ile" dönüş "çağıran, farklı veri türleri, örneğin farklı uygulanır" dönüş "var sonra" açmak "ve demek "yöntemi, çağıran" Dümen "a ile" dönüş turnSteeringWheel "yöntemi, vb - farklı şeyler yapılıyor, ancak her ikisi de denilen konum" "nesne / param kullanıyor" dönüş ".

Arama kodu gerekmez ilgili tip (ler) hakkında endişe ki ben bu uygulamak istiyorum. Bu örnekte, "dönüş", "Dümen" a "tornavida", "açmak" için yeterli olmalıdır, ya da olması gerekir ne olursa olsun "döndü."

C + + ben aşırı yükleme ile bunu istiyorum - ve C + + veri türü / imza dayalı şeyleri sıralamak istiyorum - ama bu PHP çalışmaz.

Olarak herhangi bir öneri nereden başlamalıdır? Bir switch deyimi açıktır, ama (daha şık) OO çözüm olmalı düşünüyorum. Hayır mı?

TIA

3 Cevap

Ben davethegr8 çözümünü okudum ama bir güçlü yazarak aynı şeyi yapabileceğini görünüyor:

<?php

interface Turnable
{
  public function turn();
}

class Screwdriver implements Turnable
{
  public function turn() {
    print "to turning sir!\n";
  }
}

class SteeringWheel implements Turnable
{
  public function turn() {
    print "to everything, turn, turn turn!\n";
  }
}

function turn(Turnable $object) {
  $object->turn();
}

$driver = new Screwdriver();
turn($driver);

$wheel = new SteeringWheel();
turn($wheel);

$obj = new Object(); // any object that does not implement Turnable
turn($object); // ERROR!

PHP parametresi için bir tür ipucu kullanmak için izin vermez, ve tip ipucu bir arayüz adı yerine bir sınıf adı olabilir. Yani $object Turnable arabirimini uygular eğer, o zaman must turn() yöntemi var emin olabilirsiniz. Uygular Turnable dönüm gerçekleştirmek için kendi şeyi yapabilir her sınıf.

Ben bu işe düşünüyorum ...

function turn($object) {
    if(method_exists($object, 'turn'.ucwords(get_class($object))) {
        $fname = 'turn'.ucwords(get_class($object));
        return $object->$fname();
    }

    return false;
}

Sen talimatlar here için PHP Manual kontrol etmek gerekir