<?php
class guitar_exception extends Exception { };

interface guitar_interface {
  public function tune($string);
  public function play($string);
}

abstract class guitar_abstract
{
  private $pickup;
  private $strings = array();
  private $tunigs  = array();

  public function playChord($strings)
  {
    if(!is_array($strings) || count($strings) < 6) {
      throw new guitar_exception("no such string set");
    }
  }

  public function tune($string)
  {
    $this->strings[$string] = $this->tunings[$string];
  }

  public function play($string)
  {
    return $this->strings[$string];
  }

  abstract public function select_pickup($pickup);
}


class les_paul extends guitar_abstract implements guitar_interface
{

  public function select_pickup($pickup)
  {
    if ($pickup != 1 && $pickup != 2) {
      throw new guitar_exception("no such pickup: $pickup");
    }

    $this->pickup = $pickup;
  }
}

class strat extends guitar_abstract implements guitar_interface {

  public function select_pickup($pickup)
  {

    $pickup_array = array(1, 2, 3);

    if(!in_array($pickup, $pickup_array)) {
      throw new guitar_exception("no such pickup: $pickup");
    }

    $this->pickup = $pickup;
  }
}

try {

  $my_les_paul = new les_paul;
  $my_les_paul->select_pickup(5);

} catch (guitar_exception $e) {
  echo $e->getMessage();
}
?>