Improvements
------------

Zend was designed from the ground up for increased speed,
reduced memory consumption and more reliable execution.  We dare
say it meets all of these goals and does so pretty well.  Beyond
that, there are several improvements in the language engine
features:

* References support.  $foo = &$a; would make $foo and $a be two
  names to the same variable.  This works with arrays as well,
  on either side;  e.g., $foo = &$a[7]; would make $foo and $a[7]
  be two names to the same variable.  Changing one would change
  the other and vice versa.
* Object overloading support.  This feature allows various OO
  libraries to use the OO notation of PHP to access their
  functionality.  Right now, no use is made of that feature,
  but we'd have a COM module ready by the time PHP 4.0 is released.
  A CORBA module would probably follow.
* include() and eval() are now functions, and not statements.
  That means they return a value.  The default return value from
  include() and eval() is 1, so that you can do if (include())
  without further coding.  The return value may be changed by
  returning a value from the global scope of the included file
  or the evaluated string.  For example, if 'return 7;' is executed
  in the global scope of foo.inc, include("foo.inc") would evaluate
  to 7.
* Automatic resource deallocation.  Several people have been bitten
  by the fact that PHP 3.0 had no concept of reference counting.
  Zend adds full reference counting for every value in the system,
  including resources.  As soon as a resource is no longer referenced
  from any variable, it is automatically destroyed to save memory
  and resources.  The most obvious example for the advantage in this
  is a loop that has an SQL query inside it, something like
  '$result = sql_query(...);'.  In PHP 3.0, every iteration resulted
  in another SQL result-set allocated in the memory, and all of the
  result sets weren't destroyed until the end of the script's execution.
  In Zend, as soon as we overwrite an old result set with a new one,
  the old result set which is no longer referenced, is destroyed.
* Full support for nesting arrays and objects within each other, in
  as many levels as you want.
* Boolean type.  true and false are now constants of type boolean.
  Comparing any other value to them would convert that value to a
  boolean first, and conduct the comparison later.  That means, for
  example, that 5==true would evaluate to true (in PHP 3.0, true
  was nothing but a constant for the integer value of 1, so 5==true
  was identical to 5==1, which was false).
* Runtime binding of function names.  This complex name has a simple
  explanation - you can now call functions before they're declared!
* Added here-docs support.
* Added foreach.  Two syntaxes supported:
   foreach(array_expr as $val) statement
   foreach(array_expr as $key => $val) statement
* A true unset() implementation.  A variable or element that is unset(), is now
  sent to oblivion in its entirely, no trace remains from it.
* Output buffering support!  Use ob_start() to begin output buffering, ob_end_flush()
  to end buffering and send out the buffered contents, ob_end_clean() to end buffering
  without sending the buffered contents, and ob_get_contents() to retreive the current
  contents of the output buffer.
  Header information (header(), content type, cookies) are not buffered.  By turning
  on output buffering, you can effectively send header information all throughout your
  file, regardless of whether you've emitted body output or not.
* Full variable reference within quoted strings:
  ${expr}		- full indirect reference support for scalar variables
  {variable}	- full variable support
  For example:
  $foo[5]["bar"] = "foobar";
  print "{$foo[5]["bar"]}";  // would print "foobar"
* Ability to call member functions of other classes from within member functions or from
  the global scope. You can now, for example, override a parent function with a child function,
  and call the parent function from it. 
* Runtime information for classes (class name, parent, available functions, etc.).
* Much more efficient syntax highlighter - runs much quicker, performs more reliably, and
  generates much tighter HTML.
* A full-featured debugger has been integrated with the language (supports breakpoints,
  expression evaluation, step-in/over, function call backtrace, and more).


Incompatabilities
-----------------

Zend claims 100% compatability with the engine of PHP 3.0, and is
shamelessly lying about it.  Here's why:

* static variable initializers only accept scalar values
  (in PHP 3.0 they accepted any valid expression).  The impact
  should be somewhere in between void and non existent, since
  initializing a static variable with anything but a simple
  static value makes no sense at all.

* The scope of break and continue is local to that of an
  include()'d file or an eval()'d string.  The impact should
  be somewhat smaller of the one above.

* return statement from a require()'d file no longer works.  It
  hardly worked in PHP 3.0, so the impact should be fairly small.
  If you want this functionality - use include() instead.

* unset() is no longer a function, but a statement.  It was never
  documented as a function so the impact should be no bigger than
  nada.

* The following letter combination is not supported within encapsulated
  strings:  "{$".  If you have a string that includes this letter
  combination, for example, print "{$somevar"; (which printed the
  letter { and the contents of the variable $somevar in PHP 3.0),
  it will result in a parse error under Zend.  In this case, you
  would have to change the code to print "\{$somevar";
  This incompatability is due to the full variable reference
  within quoted strings feature added in Zend.
  

