<?php
class Dog {
   private $_onspeak;

   public function __construct($name) {
      $this->_name = $name;
   }

   public function bark() {
      if(isset($this->_onspeak)) {
         if(! call_user_func($this->_onspeak)) {
            return false;
         }
      }

      print "Hau, hau!";
   }

   public function onspeak($functionName, $objOrClass = null) {
      if($objOrClass) {
         $callback = array($objOrClass, $functionName);
      } else {
         $callback = $functionName;
      }

      // sprawdzenie, czy funkcj zwrotn da si wywoa
      if(!is_callable($callback, false, $callableName)) {
         throw new Exception("Funkcja zwrotna $callableName nieprawidowa!");
         return false;
      }

      $this->_onspeak = $callback;
   }
}  // koniec klasy Dog

// funkcja
function isEveryoneAwake() {
   if(time() < strtotime("today 8:30")||
      time() > strtotime("today 22:30")) {
      return false;
   } else {
      return true;
   }
}

$objDog = new Dog('Reksio');
$objDog->onspeak('isEveryoneAwake');
$objDog->bark(); // grzeczny piesek

$objDog2 = new Dog('Azor');
$objDog2->bark(); // zawsze szczeka

// Powoduje zgoszenie wyjtku
$objDog3 = new Dog('Lassie');
$objDog3->onspeak('nieIstniejacaFunkcja', 'NieIstniejacaKlasa');
$objDog3->bark();
?>