문제

나는 다음과 같은 것을 달성하고 싶습니다 : 메소드를 호출하고 "회전"이라고 말한 다음 "턴"을 다른 데이터 유형에 다르게 적용하고, 예를 들어 "스크루 드라이버"객체/param을 사용하여 "Turn"을 호출하십시오. "메소드,"스티어링 휠 "객체/매개 변수로"회전 "을 호출하면"Turnsteeringwheel "메소드 등이 사용됩니다. 다른 작업이 수행되고 있지만 둘 다"Turn "이라고합니다.

호출 코드가 관련된 유형에 대해 걱정할 필요가 없도록이를 구현하고 싶습니다. 이 예에서 "Turn"은 "스크루 드라이버", "스티어링 휠"또는 "회전"해야 할 수도있는 것으로 충분해야합니다.

C ++에서는 과부하 로이 작업을 수행하고 C ++는 데이터 유형/서명을 기반으로 정렬 할 것이지만 PHP에서는 작동하지 않습니다.

어디서부터 시작 해야하는지에 대한 제안이 있습니까? 스위치 문은 분명하지만 (더 우아한) OO 솔루션이 있어야한다고 생각합니다. 아니?

티아

도움이 되었습니까?

해결책

나는 Davethegr8의 솔루션을 읽었지만 더 강력한 타이핑으로 똑같은 일을 할 수있는 것 같습니다.

<?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를 사용하면 매개 변수에 유형 힌트를 사용할 수 있으며 유형 힌트는 클래스 이름 대신 인터페이스 이름이 될 수 있습니다. 그래서 당신은 그것을 확신 할 수 있습니다 $object 상행 Turnable 인터페이스, 그런 다음 ~ 해야 하다 가지고있다 turn() 방법. 구현되는 각 수업 Turnable 회전을 달성하기 위해 자신의 일을 할 수 있습니다.

다른 팁

나는 이것이 효과가 있다고 생각한다 ...

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

    return false;
}

PHP 매뉴얼에 지침을 확인해야합니다 여기

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top