<?php
  class Date { 
    private
      $utime    = 0;
      
    public function __construct($arg= -1) {
      if (is_int($arg)) {
        $this->utime= $arg < 0 ? time() : $arg;
      } else {
        $this->utime= strtotime($arg);
      }
    }
    
    public function toString($fmt= 'r') {
      return date($fmt, $this->utime);
    }
  }
  
  class Revision { 
    public
      $version    = 0,
      $author     = '',
      $date       = NULL;
      
    public function __construct($version, $author, [Date] $date= NULL) {
      $this->version= $version;
      $this->author= $author;
      $this->date= $date ? $date : new Date();
    }
    
    public function getDate() {
      return $this->date;
    }
  }
  
  class Article {
    public
      $created_at = NULL,
      $lastchange = NULL,
      $revisions  = array();
      
    public function setCreated_at(Date $date) { 
      $this->created_at= $date;
    }
    
    public function addRevision(Revision $revision) {
      $this->revisions[]= $revision;
      return $revision;
    }

    public function setLastchange([Date] $date) { 
      $this->lastchange= $date;
    }
  }
  
  $a= new Article();
  $a->setLastchange(new Date());
  $a->setLastchange(NULL);              // Passes
  $a->setCreated_at(new Date());
  
  $a->setCreated_at(NULL);              // Fails
  
  var_dump($a);
  
  var_dump($a->addRevision(new Revision(1, 'timm'))->getDate()->toString());

  // Pass 0 as value for date parameter
  $date= $a->addRevision(new Revision(2, 'foo', 0))->getDate();

  var_dump($date);  // Prints "NULL"
?>
