1999-04-08 02:10:10 +08:00
|
|
|
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:
|
1999-04-08 12:11:23 +08:00
|
|
|
foreach(array_expr as $val) statement
|
|
|
|
foreach(array_expr as $key => $val) statement
|
1999-04-08 02:10:10 +08:00
|
|
|
* 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
|
2000-03-02 01:10:45 +08:00
|
|
|
should be somewhere in between void and non existent, since
|
1999-04-08 02:10:10 +08:00
|
|
|
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.
|
|
|
|
|