문제
나는 다음과 같은 것을 달성하고 싶습니다 : 메소드를 호출하고 "회전"이라고 말한 다음 "턴"을 다른 데이터 유형에 다르게 적용하고, 예를 들어 "스크루 드라이버"객체/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 매뉴얼에 지침을 확인해야합니다 여기