Browse files

PHP 4.0

  • Loading branch information...
1 parent d94f3e2 commit aceaabceffd537a0ed83fa25e189b08eae585f4a @zsuraski zsuraski committed Apr 7, 1999
Showing with 19,789 additions and 0 deletions.
  1. +11 −0 BUGS
  2. +624 −0 CHANGES
  4. +339 −0 COPYING
  5. +176 −0 CREDITS
  6. +859 −0 ChangeLog
  8. +538 −0 FUNCTION_LIST.txt
  9. +159 −0 INSTALL
  10. +64 −0 LICENSE
  11. +1,078 −0
  12. +57 −0 README.QNX
  13. +59 −0 README.WIN32
  14. +100 −0 TODO
  15. +17 −0 WISHLIST
  16. +55 −0 WISHLIST-3.1
  17. +261 −0 acconfig.h
  18. +417 −0 aclocal.m4
  19. +4 −0 apMakefile.libdir
  20. +77 −0 apMakefile.tmpl
  21. +492 −0 apidoc.txt
  22. +705 −0 bison.simple
  23. +85 −0
  24. +244 −0 calendar.mak
  25. +743 −0 config.guess
  26. +489 −0
  27. +939 −0 config.sub
  28. +1,965 −0
  29. +46 −0 control_structures.h
  30. +204 −0 crypt.mak
  31. +62 −0 cvsusers
  32. +234 −0 dbase.mak
  33. +201 −0 dbm.mak
  34. +20 −0 ext/ereg/regex/COPYRIGHT
  35. +141 −0 ext/ereg/regex/
  36. +32 −0 ext/ereg/regex/README
  37. +92 −0 ext/ereg/regex/WHATSNEW
  38. +31 −0 ext/ereg/regex/cclass.h
  39. +102 −0 ext/ereg/regex/cname.h
  40. +242 −0 ext/ereg/regex/debug.c
  41. +1,019 −0 ext/ereg/regex/engine.c
  42. +510 −0 ext/ereg/regex/main.c
  43. +76 −0 ext/ereg/regex/mkh
  44. +1,546 −0 ext/ereg/regex/regcomp.c
  45. +124 −0 ext/ereg/regex/regerror.c
  46. +502 −0 ext/ereg/regex/regex.3
  47. +233 −0 ext/ereg/regex/regex.7
  48. +106 −0 ext/ereg/regex/regex.dsp
  49. +29 −0 ext/ereg/regex/regex.dsw
  50. +79 −0 ext/ereg/regex/regex.h
  51. +304 −0 ext/ereg/regex/regex.mak
  52. +138 −0 ext/ereg/regex/regex2.h
  53. +140 −0 ext/ereg/regex/regexec.c
  54. +37 −0 ext/ereg/regex/regfree.c
  55. +316 −0 ext/ereg/regex/split.c
  56. +475 −0 ext/ereg/regex/tests
  57. +22 −0 ext/ereg/regex/utils.h
  58. +228 −0 ext/snmp/winsnmp.c
  59. +194 −0 filepro.mak
  60. +9 −0 foo
  61. +3 −0 foo2
  62. +43 −0 foo3
  63. +41 −0 foo4
  64. +7 −0 footer
  65. +214 −0 gd.mak
  66. +171 −0 getopt.c
  67. +9 −0 getopt.h
  68. +29 −0 header
  69. +214 −0 hyperwave.mak
  70. +194 −0 imap4.mak
  71. +238 −0 install-sh
  72. +171 −0 internal_functions.c
  73. +194 −0 ldap.mak
  74. +7 −0
Sorry, we could not display the entire diff because it was too big.
@@ -0,0 +1,11 @@
+If you think you've found a bug in PHP3, you can report it on the bug
+reporting page at:
+Current Known Bugs:
+* split() function doesn't return regex errors nicely
+* Preprocessed scripts don't work with require() and define()
+* unset() doesn't actually erase the variables it just marks them as uninitialized
+* Some parts in the language core prevent more than 256 arguments in function
+ calls from being possible
@@ -0,0 +1,624 @@
+Noticeable Changes between PHP/FI 2.0 and PHP 3.0
+This file was designed to be viewed with a tab size of 4 characters.
+This file is divided into 4 sections:
+1. Downwards incompatible language changes. This section includes all of
+ the changes in the core language which may require people to modify
+ their scripts before using them with PHP 3.0. It does NOT list
+ changes made in the behavior of specific functions.
+2. New language features. This section includes all of the new additions
+ to the core language, that may be used to enhance scripts designed for
+ PHP 3.0. Likewise, it does not include a listing of new functions.
+3. Structural changes not directly effecting the end user. The core
+ of PHP 3.0 is a complete rewrite. As such, many issues effecting
+ PHP/FI 2.0 were addressed and vastly improved in this version,
+ resulting in a much more stable and efficient implementation. This
+ section lists these changes in design.
+4. Other changes that don't fit in any of the above categories.
+Please remember that PHP 3.0's core is a complete rewrite, and thus,
+there may be other undocumented incompatibilities we haven't thought
+of ourselves. If you think you've found a incompatibility (or a new
+feature) which is not listed here, please mail us at
+ - Zeev
+Downwards incompatible language changes
+[1] The close-PHP tag has changed from > to ?>
+ This means that instead of writing:
+ <?echo $title;>
+ You should write:
+ <?echo $title;?>
+ PHP3 also includes support for a longer-form start tag that is
+ XML-compliant:
+ <?php echo $title;?>
+ The ability to use the short start tag ('<?') can be turned on and
+ off using the short_tags() function. Whether it is enabled or not by
+ default is a compile-time option (normally set to enabled by default).
+[2] Semicolons in if/elseif/else must be replaced with colons.
+ For example, the equivalent of:
+ if (expr);
+ statements
+ ...
+ elseif (expr);
+ statements
+ ...
+ else;
+ statements
+ endif;
+ in PHP 3.0 would be:
+ if (expr):
+ statements
+ ...
+ elseif (expr):
+ statements
+ ...
+ else:
+ statements
+ endif;
+ Note that the endif is followed by a semicolon and not a colon even in
+ PHP 3.0, which marks the end of the entire IF sentence.
+ Also note that the implementation of the colon-mode and curly-braces
+ mode in PHP 3.0 is identical, one isn't buggier than the other (note
+ that I'm not saying they're not buggy, though :)
+[3] Semicolons in while loops must also be replaced with colons.
+ For example, the equivalent of:
+ while (expr);
+ statements
+ ...
+ endwhile;
+ in PHP 3.0 would be:
+ while (expr):
+ statements
+ ...
+ endwhile;
+ Note that the endwhile is followed by a semicolon and not a colon even
+ in PHP 3.0, which marks the end of the WHILE sentence. As with the IF
+ statement, the implementation of the colon-mode and curly-braces mode
+ in PHP 3.0 is identical, one isn't buggier than the other.
+ Also note that failing to change the semicolon to a colon can result in
+ scripts that get stuck in the while loop because the loop-condition never
+ changes.
+[4] $foo[0] is no longer identical to $foo.
+ In PHP/FI 2.0, a side-effect of the implementation caused $foo[0] to be
+ identical to $foo. This is not the case in PHP 3.0.
+[5] Expressions determine their types differently.
+ The way expressions are evaluated has changed radically in PHP 3.0.
+ Expressions are no longer given the type of the left argument, but are
+ assigned types taking both types into account, and regardless of which
+ is on the left side and which is on the right side. On simple scripts
+ that should probably not effect you, but if you've relied on this fact
+ (even without realizing you do) it may change the way your scripts work.
+ Consider the next example:
+ $a[0]=5;
+ $a[1]=7;
+ $key = key($a);
+ while ("" != $key) {
+ echo "$key\n";
+ next($a);
+ }
+ In PHP/FI 2.0, this would display both of $a's indices. In PHP 3.0, it
+ wouldn't display anything. The reason is that in PHP/FI 2.0, because the
+ left argument's type was string, a string comparison was made, and indeed
+ "" does not equal "0", and the loop went through. In PHP 3.0, when a
+ string is compared with an integer, an integer comparison is made (the
+ string is converted to an integer). This results in comparing atoi("")
+ which is 0, and $key which is also 0, and since 0==0, the loop doesn't
+ go through even once. The fix for this is simple, by replacing the
+ while statement with:
+ while ("" != stringval($key)) {
+ This would first convert the integer 0 to a string "0", and then
+ compare "" and "0", which are not equal, and the loop would go through
+ as expected. As mentioned later, casting operators are supported in
+ PHP 3.0 for a quicker and more readable way of changing variables'
+ types. For example, you could use:
+ while ("" != (string)$key) {
+[6] The structure of error messages has changed.
+ Although the error messages are usually more accurate, you won't be shown
+ the actual line of text and actual place in which the error occured.
+ You'll be supplied with the line number in which the error has occured,
+ though.
+[7] The format string argument to echo is no longer supported.
+ Use printf(format,arg1,arg2,arg3,...) instead (unlimited arguments).
+[8] The use of read-mode $array[] is no longer supported.
+ That is, you cannot traverse an array by having a loop that does $data =
+ $array[]. Use current() and next() instead. Also, $array1[] = $array2
+ does not append the values of $array2 to $array1, but appends $array2
+ as the last entry of $array1 (see the multidimensional array support).
+[9] Apache versions older than 1.2 are not supported anymore.
+ The apache module requires apache 1.2 or later (1.3-beta is supported).
+[10] Indirect references inside quoted strings
+ PHP2-style indirect reference inside quoted strings is no longer
+ supported. That is, if $foo="bar", and $bar="abc", in PHP2,
+ "$$foo" would print out "abc". In PHP3, this would print
+ "$bar" (the contents of $foo is replaced with "bar").
+ To use indirect reference in PHP3 inside quoted strings, you should use
+ the new notation: "${$foo}". The standard $$foo notation will work
+ outside of the quoted string.
+ Some functions have changed names, are missing, or have been deprecated
+ by other functions
+ As a whole new rewrite, written by many more people and supporting many
+ more APIs than it's predecessor, there's a good chance some of the functions
+ you're used to from PHP/FI 2 aren't available in release 3, or have changed
+ names. Many functions that do exist behave a bit differently, mainly
+ because they return different values for errors (false) but also for other
+ reasons. We can't list all of these functions here, simply because drawing
+ a full comparison between the function sets of the two versions is way too
+ much work. If a converted PHP/FI 2 script doesn't work for you, nothing
+ can replace the good old human eye going over the code, doublechecking
+ with the online manual that each function still does what you expected it
+ to do.
+[12] Other incompatibilities.
+ It's not too unlikely that other documented behavior of PHP2 has changed
+ in this release. If you think you've found an example, please mail
+ us at Even if you've found an undocumented
+ feature of PHP2 that stopped working in PHP3, we'd like to know about it
+ (although it's more than likely that it will not be supported).
+New Language Features
+[1] Expressions
+ PHP 3.0 includes a rich implementation of expressions, much more advanced
+ than this of 2.0. Just about any complex C-like or perl-like expression
+ would work. Support was added for assignment operators (+=, -=, *= etc),
+ pre and post increment/decerement (e.g. $i++, ++$i) and the questionmark
+ operator ( (expr?expr:expr) ). Every assignment is now an expression
+ with a value, which means stuff like $a = $b = $c = $d = 0; would work.
+ It is difficult to describe the power of expressions within a few lines
+ of text, but if you're familiar with them, you probably get the picture.
+[2] for loops are now supported.
+ for loops were fairly difficult to implement (in fact, we didn't find
+ any parallel interpreter that supports for loops anywhere (no, perl is
+ not an interpreter)). The bottom line is that for loops work, and are
+ around 5% slower than comparable while loops (that may vary), but often
+ they're much nicer.
+ The syntax is identical to the one of C:
+ for (expr; expr; expr) statement;
+ or
+ for (expr; expr; expr) { statements ... }
+ The first expression is executed the first time the loop is encountered,
+ the loop is run as long as the second expression is evaluated as TRUE,
+ and after each iteration, the 3rd expression is evaluated.
+ Colon-mode FOR loops are also supported:
+ for (expr; expr; expr):
+ statements
+ ...
+ endfor;
+[3] do..while(expr) loops are now supported.
+ Like with its C parallel, the statements inside a do..while loop are
+ run once the first time the loop is encountered, and then as long as
+ the expression evaluates as true.
+ For example:
+ do {
+ statements;
+ } while ($i++ < $max);
+[4] break and continue statements are now supported inside loops.
+ You can break out of loops, or continue to the next iteration of the
+ loop using these statements. A special feature of PHP is the ability
+ to specify an expression argument to break or continue, which specifies
+ how many loops you want to break out from or continue to. For example:
+ for ($i=0; $i<10; $i++) {
+ for ($j=0; $j<10; $j++) {
+ if ($j>5)
+ break;
+ if ($i>5)
+ break 2;
+ }
+ }
+ The first break statement would end the inner loop every time $j is
+ greater than 5. The second break statement would end both the inner
+ and outer loop when $i is greater than 5.
+ Note: For this matter, switch statements are considered as loops. So
+ if you write "break 2;" inside a switch statement, you would be asking
+ to break out of the switch, and the innermost loop in which is nested.
+[5] Switched to C-style declaration of functions.
+ Here's a pretty useless function which makes a good example:
+ function concat($str1,$str2)
+ {
+ return $str1.$str2;
+ }
+ NOTE: The old style function definition is still supported, to
+ allow easier upgrading from PHP/FI 2.0 scripts. Simply
+ change 'function' to 'old_function' for these functions.
+[6] OOP support
+ Classes and inheritance are supported to a limited extent in PHP 3.0.
+ Here's how to declare a simple class:
+ class simple_class {
+ var $property1,$property2;
+ var $property3=5;
+ function display() {
+ printf("p1=%d, p2=%d, p3=%d\n",
+ $this->property1,
+ $this->property2,
+ $this->property3);
+ }
+ function init($p1,$p2) {
+ $this->property1 = $p1;
+ $this->property2 = $p2;
+ }
+ };
+ Here's how to create an object of that class:
+ $obj = new simple_class;
+ At this point, $obj is an object with 2 uninitialized variables, 1
+ initialized variable, and 2 member functions. No protection is made on
+ the internals of the object, and using its properties is simple:
+ $obj->property1 = 7;
+ would assign 7 to $property1 inside $obj. Calling member functions is
+ also simple:
+ $obj->display()
+ would run the display() member function of $obj. Note that the
+ implementation of display() uses the special variable $this, which is
+ replaced with the object the function is called on.
+ Inheritance is pretty simple too:
+ class complex_class extends simple_class {
+ var $property4="test";
+ function display() {
+ printf("p1=%d, p2=%d, p3=%d, p4=%d\n",
+ $this->property1,
+ $this->property2,
+ $this->property3,
+ $this->property4);
+ }
+ }
+ Basically, the class complex_class inherits everything from its parent,
+ simple_class, except properties or member functions which override the
+ ones in the parent. In this example, since we supply an alternative
+ display() function, it would be used with complex_class objects instead
+ of the display() function that was declared in simple_class. On the other
+ hand, since we don't supply an alternative init() function, complex_class
+ objects would have the same init() function as simple_class objects do.
+ As with expressions, it's impossible to teach OOP in a few lines, and
+ personally I'm unclear as to how useful this would be in day to day
+ scripting. If you like this, play with this until you figure it out :)
+ Objects can reside in arrays, and can contain arrays. However,
+ a limitation of the current implementation doesn't allow an object
+ to contain an array of objects (actually, this is allowed, but
+ there's no way to address the properties of such an object directly,
+ but only indirectly). For example, assuming $a[3] is an object,
+ $a[3]->b[2] is an object as well, you can't address the properties
+ of $a[3]->b[2] (i.e. you can't write $a[3]->b[2]->foo = "bar", for
+ instance).
+[7] Function pointers are now supported.
+ A simple illustrative example:
+ $func_ptr = "time";
+ $current_time = $func_ptr();
+ is identical to
+ $current_time = time();
+[8] Indirect references are much more powerful.
+ For example, one can use the dollar operator an infinite amount of times:
+ $a = "b";
+ $b = "c";
+ $c = "d";
+ $d = "e";
+ $e = "Testing\n";
+ echo $$$$$a;
+ Would display $e's content, which is "Testing\n".
+ In addition, one can use complex expressions to generate variable names
+ using a perl-like notation:
+ $i="123";
+ ${"test".$i} = 5;
+ would assign 5 to $test123.
+[9] A string concatenation operator was added, '+' no longer concatenates strings.
+ A perl-like string concatenation operator was added, the '.' operator.
+ It converts both of its arguments to strings, and concatenates them.
+ For example:
+ $result = "abcd".5;
+ assigns "abcd5" to result. Note that under PHP 3.0, the '+' operator
+ no longer performs concatenation if its arguments are strings. Use
+ the '.' operator instead.
+[10] Supports passing function arguments by references instead of by value.
+ Support for passing function arguments by reference instead of by value
+ has been added. This doesn't result in having to change the function
+ implementations in any way, but, when calling the function, you can
+ decide on whether the variable you supply would actually be changed by
+ the function, or a copy of it.
+ Example:
+ function inc($arg)
+ {
+ $arg++;
+ }
+ $i=0;
+ inc($i); # here $i in the outer scope wouldn't change, and remain 0
+ inc(&$i); # here $i is passed by reference, and would change to 1
+[11] Support for multidimensional arrays.
+ (Or as Andi calls them, 'hyperdimensional variables'.)
+ The easiest way to define this support of PHP 3.0 is inductive -
+ arrays can contain any type of variables, including other arrays.
+ A simple example:
+ $a[0]=5;
+ $a[1]["testing"]=17;
+ $b["foo"]=$a;
+ Ok, so it may be not so simple. Play with it, it's pretty powerful.
+[12] Array initialization is now supported.
+ For example, let's say you want to initialize a lookup table to convert
+ number to month names:
+ $months = array("January", "February", "March",
+ "April", "May", "June", "July", "August",
+ "September", "October", "November", "December");
+ would assign $months[0] to be January, $months[1] to be February, etc.
+ Alternately, you may want the count to start at '1' instead of 0.
+ You can do so easily:
+ $months = array(1=>"January", "February", "March",
+ "April", "May", "June", "July", "August",
+ "September", "October", "November", "December");
+ Also, you can specify an index for every entry, not just the first one:
+ $first_names = array("Doe"=>"John", "Gates"=>"William",
+ "Clinton"=>"Bill" });
+ would assign $first_names["Doe"]="John", etc.
+[13] Perl style lists now supported.
+ Multiple values from arrays may now be assigned into several
+ variables using one assignment. For example:
+ $str = "johndoe:x:555:555:Doe, John:/home/johndoe:/bin/tcsh";
+ list($username,$passwd,$uid,$gid,$realname,$homedir,$shell) =
+ explode(":",$str);
+ Would assign 'johndoe' into $username, 'x' into $passwd, etc.
+[14] Colons are supported in 'case' and 'default' statements.
+ For example:
+ switch($value) {
+ case 'A':
+ statement;
+ break;
+ case 'B':
+ statement;
+ break;
+ case 'C':
+ statement;
+ /* fall-through */
+ default:
+ statement;
+ }
+ Semicolons are still supported, but when writing new scripts, they
+ should be phased out in favour of colons.
+Non Language Related New Features
+[1] Persistent resource lists.
+ In plain english this means that there's now an easy way of writing the
+ SQL drivers so that they don't open and close the SQL link every time,
+ but instead open it the first time it's required, and then use it on
+ every later hit. As of PHP 3.0a1, only the MySQL, mSQL and PostgresSQL
+ drivers have been changed (rewritten) to take advantage of this option.
+ To use it, use mysql_pconnect() instead of mysql_connect() (or the
+ equivalents for the two other databases).
+[2] Configuration file.
+ PHP now has its own configuration file, and many compile-time options
+ of PHP2 are now configurable at runtime.
+[3] Syntax Highlighting.
+ A syntax highlighter has been built into PHP 3.0, which means PHP 3.0 can
+ display your code, syntax highlighted, instead of executing it.
+ There are currently two ways to use the syntax highlighter. One is to
+ use the show_source() statement. This statement is identical to the
+ include() statement, except instead of executing the file, it displays
+ its source syntax highlighted.
+ The second way is possible only when running as an apache module, and is
+ to define a special extension for PHP 3.0 source files (e.g. .php3s)
+ and instruct apache to automatically syntax highlight them.
+[4] Loadable modules.
+ This would have a huge impact on the Windows version, and would probably
+ be used in the UNIX environment as well. One can now add PHP internal
+ functions in runtime by loading a dynamic module. This is known to work
+ under Solaris, Linux and Win32 at this time, but would be ported to any
+ other capable platform if an incompatability is found.
+Other Interesting Issues
+[1] Improved performance.
+ The performance of PHP 3.0 is much better than the one of PHP/FI 2.0.
+ Memory consumption has been dramatically reduced in many cases, due
+ to the use of an internal memory manager, instead of apache's pools.
+ Speedwise, PHP 3.0 is somewhere between 2 and 3 times faster than
+ PHP/FI 2.0.
+[2] More reliable parser.
+ After PHP 3.0 is well tested, it'll be pretty safe to say that it's
+ more reliable than PHP/FI 2.0 is. While PHP/FI 2.0 performed well on
+ simple, and fairly complex scripts, a fundamental design difference
+ from PHP 3.0 makes it more prone to errors. In PHP 3.0, obscure parser
+ problems are much less likely.
+[3] Improved C API.
+ If you're a C coder, adding functionality to PHP was never easier.
+ A pretty well documented API is available (apidoc.txt), and you no longer
+ have to touch the parser or scanner code when adding your function.
+ Also, it's more complicated to 'go wrong' when implementing a PHP3
+ function than it was in PHP2 (no stack to maintain) - but of course,
+ you can mess up here too :)
+[4] Name change.
+ PHP/FI 2.0 was renamed to PHP 3.0, and the meaning has changed from
+ 'Personal Home Pages / Forms Interpreter' to 'PHP: Hypertext Preprocessor'.
+ 'Personal' home pages was an understatement for PHP/FI 2.0, and is
+ definitely an understatement for PHP 3.0.
@@ -0,0 +1,149 @@
+PHP Coding Standards
+This file lists several standards that any programmer, adding or changing
+code in PHP, should follow. Since this file was added at a very late
+stage of the development of PHP v3.0, the code base does not (yet) fully
+follow it, but it's going in that general direction.
+This is an initial version - it'll most probably grow as time passes.
+Code Implementation
+[1] Functions that are given pointers to resources should not free them
+For instance, function int mail(char *to, char *from) should NOT free
+to and/or from.
+ - The function's designated behavior is freeing that resource. E.g. efree()
+ - The function is given a boolean argument, that controls whether or not
+ the function may free its arguments (if true - the function must free its
+ arguments, if false - it must not)
+ - Low-level parser routines, that are tightly integrated with the token
+ cache and the bison code for minimum memory copying overhead.
+[2] Functions that are tightly integrated with other functions within the
+ same module, and rely on each other non-trivial behavior, should be
+ documented as such and declared 'static'. They should be avoided if
+ possible.
+[3] Use definitions and macros whenever possible, so that constants have
+ meaningful names and can be easily manipulated. The only exceptions
+ to this rule are 0 and 1, when used as false and true (respectively).
+ Any other use of a numeric constant to specify different behavior
+ or actions should be done through a #define.
+[4] When writing functions that deal with strings, be sure to remember
+ that PHP holds the length property of each string, and that it
+ shouldn't be calculated with strlen(). Write your functions in a such
+ a way so that they'll take advantage of the length property, both
+ for efficiency and in order for them to be binary-safe.
+ Functions that change strings and obtain their new lengths while
+ doing so, should return that new length, so it doesn't have to be
+ recalculated with strlen() (e.g. _php3_addslashes())
+[5] Use php3_error() to report any errors/warnings during code execution.
+ Use descriptive error messages, and try to avoid using identical
+ error strings for different stages of an error. For example,
+ if in order to obtain a URL you have to parse the URL, connect,
+ and retreive the text, assuming something can go wrong at each
+ of these stages, don't report an error "Unable to get URL"
+ on all of them, but instead, write something like "Unable
+ to parse URL", "Unable to connect to URL server" and "Unable
+ to fetch URL text", respectively.
+[6] NEVER USE strncat(). If you're absolutely sure you know what you're doing,
+ check its man page again, and only then, consider using it, and even then,
+ try avoiding it.
+Naming Conventions
+[1] Function names for user functions implementation should be prefixed with
+ "php3_", and followed by a word or an underscore-delimited list of words,
+ in lowercase letters, that describes the function.
+[2] Function names used by user functions implementations should be prefixed
+ with "_php3_", and followed by a word or an underscore-delimited list of
+ words, in lowercase letters, that describes the function. If applicable,
+ they should be declared 'static'.
+[3] Variable names must be meaningful. One letter variable names must be
+ avoided, except for places where the variable has no real meaning or
+ a trivial meaning (e.g. for (i=0; i<100; i++) ...).
+[4] Variable names should be in lowercase; Use underscores to seperate
+ between words.
+Syntax and indentation
+[1] Never use C++ style comments (i.e. // comment). Always use C-style
+ comments instead. PHP is written in C, and is aimed at compiling
+ under any ANSI-C compliant compiler. Even though many compilers
+ accept C++-style comments in C code, you have to ensure that your
+ code would compile with other compilers as well.
+ The only exception to this rule is code that is Win32-specific,
+ because the Win32 port is MS-Visual C++ specific, and this compiler
+ is known to accept C++-style comments in C code.
+[2] Use K&R-style. Of course, we can't and don't want to
+ force anybody to use a style she's not used to, but
+ at the very least, when you write code that goes into the core
+ of PHP or one of its standard modules, please maintain the K&R
+ style. This applies to just about everything, starting with
+ indentation and comment styles and up to function decleration
+ syntax.
+[3] Be generous with whitespace and braces. Always prefer
+ if (foo) {
+ bar;
+ }
+ to
+ if(foo)bar;
+ Keep one empty line between the variable decleration section and
+ the statements in a block, as well as between logical statement
+ groups in a block. Maintain at least one empty line between
+ two functions, preferably two.
+Documentation and Folding Hooks
+In order to make sure that the online documentation stays in line with
+the code, each user-level function should have its user-level function
+prototype before it along with a brief one-line description of what the
+function does. It would look like this:
+/* {{{ proto int abs(int number)
+ Return the absolute value of the number */
+ ...
+/* }}} */
+The {{{ symbols are the default folding symbols for the folding mode in
+Emacs. vim will soon have support for folding as well. Folding is very
+useful when dealing with large files because you can scroll through the
+file quickly and just unfold the function you wish to work on. The }}}
+at the end of each function marks the end of the fold, and should be on
+a separate line.
+The "proto" keyword there is just a helper for the doc/genfuncsummary script
+which generates a full function summary. Having this keyword in front of the
+function prototypes allows us to put folds elsewhere in the code without
+messing up the function summary.
+Optional arguments are written like this:
+/* {{{ proto object imap_header(int stream_id, int msg_no [, int from_length [, int subject_length [, string default_host]]])
+And yes, please keep everything on a single line, even if that line is massive.
@@ -0,0 +1,339 @@
+ Version 2, June 1991
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+ Preamble
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+ The precise terms and conditions for copying, distribution and
+modification follow.
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+ Appendix: How to Apply These Terms to Your New Programs
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ GNU General Public License for more details.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+Also add information on how to contact you by electronic and paper mail.
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
@@ -0,0 +1,176 @@
+PHP Version 3.0 Development Team
+Core Developers
+Rasmus Lerdorf (
+* Original language definition and implementation
+* CGI loader and many internal functions
+* Apache module support
+* SNMP module
+* Original mSQL, MySQL and Sybase modules
+* Oracle module work
+Andi Gutmans ( and Zeev Suraski (
+* New language definition and implementation
+* Internal functions API design
+* General hash table implementation for symbol tables, arrays and objects
+* Memory manager
+* Token cache manager
+* A lot of internal functions (including hebrev :) and migration from PHP 2.0
+* Syntax highlighting mode
+* Configuration file parser
+* New persistent/multilink MySQL, PosgresSQL, Sybase and mSQL modules
+* Win32 COM support
+Stig Bakken (
+* Oracle support
+* configure/install script work
+* sprintf reimplementation
+* XML support
+* SGML documentation framework
+Shane Caraveo (
+* Porting to Visual C++
+* Generalization to support different server APIs
+* Work on ISAPI and NSAPI APIs
+Jim Winstead (
+* Lots of PHP2 -> PHP3 porting
+* dBase support
+* URL parsing functions
+* Makefile work
+* Regex rewrite
+* Win32 work
+Major Contributors
+* Jouni Ahto (
+ Postgres, Informix
+* Alex Belits (
+ fhttpd support
+* Bj�rn Borud (
+ soundex code and lots of enthusiasm
+* Christian Cartus (
+ Informix Universal Server support
+* John Ellson (
+ Freetype support
+* Dean Gaudet (
+ Apache module debugging + helpful hints along the way
+* Mitch Golden (
+ Oracle testing and bug fixes
+* Danny Heijl (
+ Informix SE support
+* Mark Henderson (
+ Various odds and ends
+* Jaakko Hyv�tti (
+ Prototype cop, regular expression code fixes, CGI security issues
+* Amitay Isaacs (
+* Andreas Karajannis (
+ Adabas D, ODBC, Oracle
+* Igor Kovalenko (
+ QNX support issues
+* Richard Lynch (
+ Documentation
+* Tom May (
+ Sybase-CT work
+* Muhammad A Muquit (MA_Muquit@fccc.ed)
+ Original Sybase module
+* Mark Musone (
+* Jeroen van der Most (
+ Solid
+* Chad Robinson (
+ Documentation, FilePro
+* Lachlan Roche (
+ MD5
+* Stefan Roehrich (
+ zlib
+* Nikolay P. Romanyuk (
+ Velocis support
+* Brian Schaffner (
+ ODBC support, PHP3 API testing
+* Egon Schmid (
+ Documentation
+* (
+ Solid
+* Colin Viebrock (
+ Website graphic design and layout, PHP logo
+* Eric Warnke (
+* Lars Torben Wilson (
+ Documentation
+* Uwe Steinmann (
+ Hyperwave, PDF, Acrobat FDF Toolkit
+Beta Testers
+* Niklas Saers (
+ FreeBSD/x86
+* Chuck Hagenbuch <>
+ Linux/x86 glibc2, MySQL, mod_ssl
+* Sascha Schumann (
+ FreeBSD/x86, PostgreSQL, IMAP, gdttf
+* Jim Jagielski (
+ A/UX, FreeBSD/x86
+* Jouni Ahto (
+ Debian Linux 2.0
+Andi Gutmans and Zeev Suraski would like to thank Professor Michael Rodeh for
+his positive input during the initial development of the interpreter.
859 ChangeLog
@@ -0,0 +1,859 @@
+PHP 3.0 CHANGE LOG ChangeLog
+December 24 1998, Version 3.0.6
+- Fix GetImageSize() to work with non-standard jpg images
+- Add Mersenne Twister functions (mt_rand, mt_srand, etc)
+- Add str_replace() function
+- Add chunk_split() function
+- Fixed a bug in the memory limit code, in cases where $php_errormsg was
+ also used.
+- Add iptcparse() function
+- Adobe FDF supported
+- getallheaders() NULL string fix <>
+- Add all configuration directives to phpinfo() page
+- Functions pack() and unpack() rewritten to be binary and buffer overrun
+ safe and behave like the Perl functions for all implemented format codes.
+- Ensured that msql_error() will not return error messages generated by
+ previously-run scripts.
+- Add base_convert() function
+- Make sprintf() and printf() output binary safe
+- Made gzgetc binary safe
+- Add convert_cyr_string() and quoted_printable_decode() functions
+- Fix ldap_free_result() core dump bug
+- Add support for current OpenLDAP-2.0-devel library
+- Add php3_asp_tags directive so it can be set from Apache config files
+- Added UTF-8 support in the XML extension
+- Make rand(min,max) safer on older platforms where the low-order bits have
+ short cycles.
+- Added new pdf (Portable Document Format) module
+- Added an XML parsing extension using James Clark's "expat" library
+- Optimized parts of the token cache code.
+- Terminate on out-of-memory errors. Until now, PHP could crash in out of
+ memory situations (clean-up, no real effect).
+- Unterminated comments in include files were being reported with the wrong line
+ number. Fixed.
+- Added ImageCopy() and ImageColorDeallocate(). ImageCopy() is about
+ 20% faster than ImageCopyResized(). ImageColorDeallocate() marks
+ palette entries free for reuse (by <>).
+- In the CGI version, it was impossible to access resources (e.g. SQL links,
+ images) from user-defined shutdown functions. Fixed.
+- Added optional third parameter to strpos() to specify the offset to
+ start searching from.
+- Fixed a crash bug in unset() when unsetting illegal variables (rare).
+- Made ImageInterlace and ImageTransparentColor parameters optional, and made
+ them return the current/new settings.
+- Optimized GetImageSize() <>.
+- Made odbc_autocommit() without args return status
+- Added connect workaround for OpenLink ODBC
+- Added minimal InterBase support. Tested only on 4.0 & Linux.
+- Fixed some memory leaks and bogus error messages in the URL handler of
+ the various file open functions. Should only affect error handling
+ in bad URLs.
+October 5 1998 Version 3.0.5
+- mysql_field_flags now reports all MySQL flags and the result is suitable
+ for automatic parsing. Compatibility warning: The result format has
+ changed. If you have scripts parsing the result of this function, you
+ may need to adapt them.
+- Made nl2br() binary safe (not that it's of much use).
+- Fixed a bug in the API function getThis(). It affected mostly the dir
+ functions, if nested within objects.
+- Fixed a problem in require() in conjunction with switch(), and in some other
+ cases. Also fixed an identical problem with the call_user_function() API
+ function.
+- Removed -lpthread when compiling with MySQL support. It caused various
+ serious problems when compiled into Apache.
+- Add serialize() and unserialize() functions from
+- Fix in_addr_t check for systems with in_addr_t in netinet/in.h
+- Add atan2() function
+September 22 1998 Version 3.0.4
+- Added uksort() - array key sort using a user defined comparison function.
+- Added 'j' support to date() - generates the day of the month, without
+ possible leading zeros.
+- Added support for multiple crypt() encryptions if the system supports it
+- Added optional support for ASP-style <% %> and <%= tags
+- Fixed data loss problems with very large numeric array indices on 64-bit
+ platforms (e.g. DEC UNIX).
+- 2 cursor_type parameters for ifx_query() and ifx_prepare changed
+ to 1 (bitmask). Added a few constants for use in Informix module.
+- Added php3.ini option ifx.charasvarchar. If set, trailing blanks
+ are stripped from fixed-length char columns. (Makes life easier
+ for people using Informix SE.)
+- Static SNMP module which compiles with ucd-snmp 3.5.2
+- fixed imap_header & header_info from crashing when a header line
+ is > 1024 characters.
+- Added patch for rfc822_parse_adr to return an array of objects instead
+ of a single object.
+- Informix Online 7.x & SE 7.x support now fairly complete and stable
+- Add dbase_get_record_with_names() function
+- Added a special case for open_basedir. When open_basedir is set to "."
+ the directory in which the script is stored will be used as basedir.
+- Include alloca.c in the distribution for platforms without alloca().
+- Improved stripping of URL passwords from error messages - the length of the
+ username/password isn't obvious now, and all protocols are handled properly
+ (most importantly, http).
+- Copying objects that had member functions with static variables produced
+ undetermined results. Fixed.
+- Added function lstat() and cleaned up the status functions,
+ added tests for file status functions (this may break on some plattforms)
+- Fixed is_link() - it was returning always false.
+- Fixed apache_note() - it was corrupting memory.
+- New Function. void get_meta_tags(string filename); Parses filename until
+ closing head tag and turns all meta tags into variables prefixed with 'meta_'.
+ The below meta tag would produce $meta_test="some string here"
+ <meta name="test" content="some string here">
+- Generalized some internal functions in order to better support calling
+ user-level functions from C code. Fixes a few sporadic problems related
+ to constructors inside eval() and more.
+- Fixed an endless loop in explode(), strstr() and strpos() in case of an
+ invalid empty delimiter.
+- rand() now accepts two optional arguments, which denote the requested range
+ of the generated number. E.g., rand(3,7) would generate a random number
+ between 3 and 7.
+- Added M_PI constant.
+- Added deg2rad() and rad2deg() for converting radians<->degrees.
+- ImageArc() misbehaved when given negative angles, fixed.
+- Fixed a bug in ereg() that may have caused buglets under some circumstances.
+- Added imap_status
+- Shutdown functions, registered via register_shutdown_function(), could never
+ generate output in the Apache module version. Fixed.
+- Brought IMAP docs into sync with acutal imap code
+- imap_fetchstructure now takes in optional flags
+- Fix potential core dumps in imap_append and imap_fetchtext_full
+- Fix problem in SetCookie() function related to long cookies
+- Add uasort() function to go along with usort (like sort() and asort())
+- Add port number to Host header as per section 14.23 of the HTTP 1.1 RFC
+- Fix imap_reopen to only take 2 arguments with an optional 3rd flags arg
+- Add optional 2nd argument to imap_close
+- Add CL_EXPUNGE flag to imap_open() flags
+- Fix 4th arg on imap_append(). It was getting converted to a long by mistake.
+- Fix shutdown warning in the LDAP module
+- *COMPATIBILITY WARNING* imap_fetchstructure() "parametres" object and property
+ name changed to "parameters" to match the documentation and to be consistent
+ with the rest of the API.
+- Delete uploaded temporary files automatically at the end of a request
+- Add upload_max_filesize and correponsing php3_upload_max_filesize directive
+ to control the maximum size of an uploaded file. Setting this to 0 would
+ completely eliminate file uploads.
+- Force $PHP_SELF to PATH_INFO value when running in CGI FORCE_CGI_REDIRECT mode
+- Add apache_lookup_uri() function which does an internal sub-request lookup
+ and returns an object containing the request_rec fields for the URI. (Yes,
+ you have to be a bit of a gearhead to figure this one out)
+- Fix a few signed char problems causing functions like ucfirst() not to work
+ correctly with non-English charsets
+- md5() function not binary safe - fixed
+August 15 1998 Version 3.0.3
+- Changed the name of fopen_basedir to open_basedir, to be a little more
+ accurate about what it does.
+- Added Hyperwave module
+- Added config-option (php3_)enable_dl <on/off>. This enables/disables the
+ dl() function. In safe-mode dl() is always disabled.
+- Auto-prepended files were crashing under some circumstances - fixed.
+- Win32 mail fixes provided by
+- Comparing between arrays and/or objects now generates a warning (it always
+ returns false, as it used to; no comparison is made)
+- Fixed a bug in the syntax highlighting code, that made ending-double-quotes
+ appear twice under certain circumstances.
+- Fix bug in filetype() function related to symlinks
+- Started integrating Informix SE support to PHP configure/makefile setup.
+- gdttf roundoff fixes from
+- Added initial Informix SE support files from Danny Heijl - This code still
+ needs to be integrated into the PHP configure/makefile setup and the code
+ itself needs more work.
+- return in the global scope now terminates the execution of the current file.
+- Added the ability to register shutdown function(s), via
+ register_shutdown_function($function_name).
+- Clean up const warnings
+- Add write support to ftp fopen wrappers
+- Add strspn() and strcspn() functions
+- On systems without strerror use Apache version if compiling as Apache module
+- The PHP start tag was being ignored under some circumstances - fixed.
+- The db, dbase and filepro functions are now Safe-Mode aware.
+- Added config-option (php3_)fopen_basedir <path>. This limits the directory-
+ tree scripts can open files in to <path>.
+- Fixed pg_loreadall that didn't always return all the contents in a PostgreSQL
+ large object. Also, doesn't pass through anything if method is HEAD.
+- configure fix to create target Apache module dir
+- Fix core dump in imageTTFtext() function
+- Added static IMAP support
+- Syntax highlighting was generating additional whitespace - fixed.
+- Added ucwords. Works like ucfirst, but works on all words within a string.
+- Added array_walk() - apply user function to every element of an array
+- Added usort() - array sort that accepts a user defined comparison function!
+- Added the ability to call user-level functions and object methods on demand
+ from the C source using a completely generalized, slick API function.
+ Miracles do happen every once in a while.
+- Added constructors. Don't even squeek about destructors! :) (we mean that)
+- Make pg_lowrite() binary safe
+- Fixed mod_charset option in ./setup
+- Fixed rewinddir() and dir()::rewind() under Win32 (they didn't work before).
+- Add Win32 COM support! By-name referencing is supported using the IDispatch
+ interface (automation). Available functions - COM_Load(), COM_Invoke(),
+ COM_PropGet() and COM_PropSet().
+July 20 1998 Version 3.0.2a
+- Fix a quirk in the configuration file parser, the endless fountain of joy
+ and fun.
+- Fix a bug in the API function add_method() that made dir() crash.
+July 18 1998 Version 3.0.2
+- Compile cleanups for *BSD
+- Add support for the OpenLink ODBC Drivers
+- Add PHP_SELF, PHP_AUTH_* and HTTP_*_VARS PHP variables to phpinfo() output
+- Add workaround for broken makes
+- Add Apache 1.3.1 support (some Apache header files were moved around)
+- Added apache_note() function.
+- Fix order of system libraries and detect libresolv correctly
+- Fixed a bug in the Sybase-DB module. Several numeric field types were
+ getting truncated when having large values.
+- Added testpages for unified odbc
+- Fix php -s seg fault when filename was missing
+- Made getdate() without args default to current time
+- Added ImageColorResolve() and some fixes to the freetype support.
+- Added strcasecmp()
+- Added error_prepend_string and error_append_string .ini and .conf directives
+ to make it possible to configure the look of error messages displayed by PHP
+ to some extent
+- Added E_ERROR, E_WARNING, E_NOTICE, E_PARSE and E_ALL constants, that can be
+ used in conjunction with error_reporting()
+ (e.g. error_reporting(E_ERROR|E_WARNING|E_NOTICE);
+- Fixed a crash problem with classes that contained function(s) with default
+ values.
+- Fixed a problem in the browscap module. Browscap files weren't being read
+ properly.
+- Fix -L path in libphp3.module to make ApacheSSL compile without errors
+- Fix StripSlashes so it correctly decodes a \0 to a NUL
+July 04 1998 Version 3.0.1
+- echo/print of empty strings don't trigger sending the header anymore.
+- Implemented shift left and shift right operators (<< and >>)
+- Compile fix for cc on HP-UX.
+- Look for beta-version Solid libraries as well.
+- Make GD module show more info in phpinfo().
+- Compile fix for NextStep 3.0.
+- Fix for Oracle extension on OSF/1.
+- Fix gd 1.3 bug in ImageColorAt().
+- pg_loread() hopefully handles binary data now.
+- Turned off some warnings in dns.c
+- Added ImageTTFBBox() and made ImageTTFText() return bounding box.
+- Added constants for Ora_Bind()'s modes.
+- Renamed all hash_*() routines to _php3_hash_*() to avoid clashes with other
+ libraries.
+- Changed uodbc default LONG behaviour: longreadlen 4096 bytes, binmode 1.
+ The module now actually uses the php.ini settings.
+- New PostgreSQL functions: pg_fetch_row(), pg_fetch_array()
+ and pg_fetch_object()
+- Fix a segmentation fault when calling invalid functions in certain
+ circumstances
+- Fix bug that caused link-related functions to not pay attention to
+ run-time safe mode setting (it was using whatever was set at compile time).
+- Fix bug in exec() function when used in safe mode
+June 6 1998 Version 3.0
+- Add checkdnsrr function (check availability DNS records)
+- Add getmxrr function (get MX hostnames and weights)
+- Fixed bug in nl2br() function
+- Fix for an RC5 related problem in the Sybase module, when dealing
+ with very long data types.
+- Speed up string concatenation by roughly a factor of 2
+- Add escape-handling to date function
+- Make base64 functions binary safe
+- Add strrpos function to complement strpos function added in RC5
+- Add ltrim function (strips only at the start of string)
+- Add rtrim as an alias to chop() for completeness sake
+- Add trim function (similar to chop, except it strips at the start as well)
+- Added 2 optional args to fsockopen function - errno and errstr
+- Fixed bug in split() function related to leading matches
+- Fixed problem in error_log() function (thanks to Jan Legenhausen)
+- empty("0") was returning true - fixed
+- Removed the old sybsql module. Use the new sybase_*() functions instead.
+- Several fixes to the configuration file parser
+- LDAP fixes - fixed return values on several functions
+May 23 1998 Version 3.0RC5
+- The BC math library functions now compile in by default.
+- Fixed a bug in virtual() and other types of SSI's (e.g. <!--#exec). Under
+ certain circumstances, this used to result in random problems.
+- Fixed a bug in virtual(). It was misbehaving if it was called before any
+ other output.
+- Added mysql.default_port, mysql.default_host, mysql.default_user and
+ mysql.default_password ini-file directives.
+- Improved handling of the MySQL default port. It now honors /etc/services
+- Fixed a crash in opening of broken ftp:// URLs, and improved error reporting
+ in opening of URLs.
+- Fixed several non-critical scanner issues with syntax highlighting mode and
+ the <script language=php> tag.
+- Fixed fseek on windows. (windows only): fseek will not return proper results
+ on files opened as text mode. PHP uses binary mode as the default for file
+ operations, but this can be overiden by fopen. Do not open files in text
+ mode and use fseek on them!
+- Add strpos() function
+- Added zlib module, requires zlib >= 1.0.9
+- Improved the module API implementation. Dynamic modules may now register
+ persistent resources (not that it makes much sense, but at least PHP
+ won't crash). The API itself remains unchanged.
+- bcmod() wasn't always behaving like modulus should behave (it was behaving
+ exactly like GNU bc's % operator). Fixed.
+- Changed the Sybase-DB module to always return strings, instead of auto-typing
+ result sets. This was done for consistency with the other database modules,
+ and in order to avoid overflows due to the platform-dependant limitations
+ of the numeric data types of PHP. You can turn compatability mode on using
+ the sybase.compatability_mode directive in the php3.ini file.
+- Fixed problems with the TINYINT field in the Sybase-CT module.
+- Applied some small speed optimizations to the Sybase-DB module querying code.
+- Added 'numeric' and 'type' properties to the object returned by
+ sybase_fetch_field().
+- The 'new' operator doesn't accept all expressions anymore. Instead, it
+ accepts a class name, or a variable reference (scalar, array element, etc).
+- Add ora_numcols() function
+- Add ora_do() and ora_fetch_into() functions to Oracle driver
+- Add persistent connection support to Oracle driver
+- Make Oracle driver clean up open connections and open cursors automatically
+- Added fread() and fwrite() that properly handle binary data.
+- Add Ora_ColumnSize() to Oracle code
+- The string "0" means FALSE again. This was done in order to maintain type
+ conversion consistency.
+- Added solid_fetch_prev() for fetching the previous result row from Solid.
+- Huge integers are now automatically converted to floating point numbers
+ (that have a wider range).
+- Floating point numbers are now displayed using scientific notation when
+ they're extremely big or extremely small. The 'precision' php3.ini directive
+ no longer designates the number of decimal digits, but rather, the maximum
+ number of significant digits required.
+- Added support for scientific notation for floating point numbers (e.g. 1E7)
+ throughout the entire language.
+- Fixed a potential/probable memory corruption problem with HEAD request
+ handling.
+- Using un-encapsulated strings now generates a NOTICE-level warning
+ (e.g. $a = foo; instead of $a = "foo";)
+- Added defined("name") function to check if a certain constant is defined
+ or not.
+- Support new Apache mechanism for setting SERVER_SUBVERSION
+- Added PHP_OS and PHP_VERSION constants
+- Added the ability to define constants in runtime! Constants are script-wide,
+ (there's no scope, once the constant is defined, it's valid everywhere).
+ Syntax is define("name", $value [, $case_insensitive]). 'name' can be any name
+ that is a valid variable name, *without* the $ prefix. 'value' can be
+ any *scalar* value. If the optional 'case_insensitive' parameter is 1,
+ then the constant is created case-insensitive (the default is case
+ sensitive). Note: define() is currently *NOT* supported in preprocessed
+ scripts.
+- Added general support for constants. The Syslog constants (e.g.
+ LOG_ERR, LOG_CRIT, etc.) should be accessed as constants from now on (that
+ is, without a $ prefix). You can still set define_syslog_variables to On
+ in the php3.ini file if you want to define the various $ variables. The
+ default for this directive in the php3.ini-dist file has been changed to
+ Off.
+- The configuration file path variable now expands . and .. into their
+ respective directories. You can obtain the path of the php3.ini file
+ that was used by printing get_cfg_var("cfg_file_path").
+- Fixed a crash-recovery parser crash ($a=7; $a[3]+=5;)
+- Add gmmktime() function
+- Fixed a crash with implode() and empty arrays.
+- Fixed a bug that, under fairly rare circumstances, caused PHP not to
+ recognize if(), require() and other statements as statements, and
+ to complain about them as being unsupported functions.
+- Beautified php3.ini-dist and added more comments to it. Also changed
+ the behavior of the configuration file parser to be brighter about
+ the various constants (TRUE/FALSE/ON/OFF etc).
+- Fixed a bug in openlog() - the specified device name was being mangled.
+- Memory leaks were sometimes reported erroneously - fixed.
+- Improved the convertor to handle some quirks of the PHP/FI 2 parser with
+ comments.
+- Fixed number_format() to properly handle negative numbers, and optimized it
+ a bit.
+- Fixed static variables inside class member functions. Note that using such
+ static variables inside member functions usually defeats the purpose of
+ objects, so it is not recommended.
+- Fixed a bug in fpassthru() (the file was being closed twice).
+- Added strftime().
+- Add set_socket_blocking() function to control blocking on socket fd's
+- The sendmail_path in php3.ini was being ignored - fixed.
+- Fixed a bug with file upload, with files that contained the MIME boundary
+ inside them.
+- Fixed a bug with form variables of type array, with spaces in their
+ index (e.g. name="foo[bar bar]").
+- gd-1.3 autodetect and support
+- Year 2000 compliance is now togglable from the php3.ini file. Setting PHP
+ to be y2k compliant effects the way it creates cookies, and means it'll
+ NOT work with many browsers out there that are not y2k compliant! For
+ that reason, the default for this option is off.
+- safe mode / fix from
+- Integrated the FreeType support in the GD extension.
+- Added --with-gd=DIR and --without-gd options to configure
+April 18 1998 Version 3.0 Release Candidate 4
+- Auto-prepended and auto-appended files were reporting the wrong filename
+ in errors and in __FILE__ - fixed.
+- Fix GPC problem related to mixed scalar and array vars with the same name
+- Made putenv() Apache-safe. Environment variables may no longer leak in
+ between requests.
+- The trailing semicolon is no longer required in class declarations.
+- Fixed a memory leak in the (array) and (object) operators under certain
+ conditions.
+- <script> tags weren't working unless short tags were enabled - Fixed.
+- Fixed a bug in certain array indices that weren't treated as numbers
+ even though they looked like numbers (e.g. "10", "20").
+- Changes to support renamed API functions in Apache-1.3
+- Fixed the -p and -e command line switches
+- Fix a segfault when calling command line version without parameters
+- Fix for feof() when used on a socket
+- Fix off-by-one error in fgets() when used on a socket
+- Fix bug in ImageSetPixel() (Thanks to
+March 31 1998 Version 3.0 Release Candidate 3
+- Tiny bugfix for magic_quotes_sybase
+- Fix Apache build problems introduced in RC2
+- $a["0"]==$a[0] fix
+- Apache-1.3 build changes to support 100% automatic builds and shared library
+ module builds. See INSTALL file.
+March 30 1998 Version 3.0 Release Candidate 2
+- Changed the socket implementation under UNIX to not use FILE pointers, in
+ order to work around the buggy Solaris libc (and possibly buggy libc's
+ in other platforms).
+- Fixed a bug in min() and max() with certain arrays.
+- *WARNING* Move Apache 1.3 php3 file install to src/modules/php3 instead of
+ src/modules/extra. Make sure you change your AddModule line correctly
+ in your Apache Configuration file. This change is to take advantage of
+ new Apache-1.3 configuration mechanism which makes it easier to build an
+ Apache server with PHP automatically enabled. It will also help building
+ a shared library module version of PHP soon.
+- Fixed a crash bug with auto-appended files.
+- Made --enable-discard-path work on all Unix servers #!/path/php CGI scripts
+ should now work everywhere. I have tested on Apache, WN and Netscape 2.0
+- Made $a["123"] and $a[123] be identical. $a["0123"] is still different,
+ though.
+- Added 'precision' ini directive, to set the number of decimal digits
+ displayed for floating point numbers (default - 6).
+- Made integer/integer divisions evaluate to floating point numbers when
+ applicable (e.g., 5/2==2.5(float), but 4/2==2(int))
+- Get rid of reliance on tied streams and move all socket reads and writes
+ to recv/send calls
+- Cleaned up head.c a bit and fixed CGI SetCookie order problem
+- Changed default variable parsing order to Get-Cookie-Post (GPC)
+- Fixed setup so it has all configure options and defaults.
+- Added optional decimal point and thousands seperator to number_format()
+ e.g., number_format(1500,2,',','.') == 1.500,00
+- Fixed cgi bug in windows that prevented files from being parsed on many
+ systems and servers.
+March 23 1998 Version 3.0 Release Candidate
+- Added support for the Raima database (ALPHA)
+- Fixed a bug in persistent PostgreSQL links and the connection-string method.
+- Added EXTENSION_STATUS file, that specifies the stability and status of
+ every module in the distribution.
+- Added optional parameters to user functions with default values, variables
+ that are forced to be passed by reference and variables that can be
+ optionally passed by reference. The ini file directive
+ 'ignore_missing_userfunc_args' is no longer supported.
+- Added fhttpd support (by Alex Belits)
+- Improved performance by approximately 20-30%.
+- Added mysql_error(), mysql_errno() (if available) and msql_error().
+ Errors coming back from the database backend no longer issue warnings.
+ Instead, use these functions to retreive the error.
+- Patched count(), each(), prev(), next(), reset() and end() to work around
+ the implementation side effects of unset(). As far as the users are
+ concerned, this should be transparent now (even though it's slower now,
+ until it's thoroughly fixed in 3.1).
+- Added number_format(). number_format(2499,2)=='2,499.00'.
+- error_reporting() now sets the error reporting level to the supplied
+ argument, without any interpretations.
+- Fixed a lookahead parser bug that occured under rare circumstances.
+- Change the comparison operators to compare numeric strings as numbers. If
+ you want to compare them as strings, you can use the new C-like strcmp()
+- Fixed Ora_GetColumn() bug when fetching strings
+- Added Ora_ColumnName() and Ora_ColumnType()
+- Preliminary LONG and LONG RAW support in Oracle extension
+- Add \123 and \xAB style octal and hex escapes to "" and `` strings
+- Add "-c" command line flag for specifying path to php3.ini file
+- Improved list() so that elements can be skipped, for example:
+ list($name,,,$realname) = explode(":",fgets($passwd_file));
+- Fixed a tiny bug in the hash initialization which caused excessive use of
+ memory. Report and fix by
+- Fixed strtolower() and strtoupper() to work with 8-bit chars
+- Fixed to compile and run on SunOS 4.1
+- Fixed a crash in soundex() of an empty string
+- Fixed parse_str() - it wasn't always defining the right variables,
+ and didn't work with arrays.
+- Made [m,My]SQL create/drop database functions return success status
+- Fixed some memory leak/crash problems in the Adabas module
+- Added each() in order to allow for easy and correct array traversing.
+- Make Apache module version respect LOCALE setting
+- Add support for Apache 1.3b6+ ap_config.h file
+- Fixed a nasty corruption bug in eval() and show_source() that resulted in
+ script termination (e.g. eval("exit();").
+- Fixed a syntax highlighting problem with keywords used as variable
+ names.
+- Fixed a possible crash and/or file descriptor leak
+- Fixed line number being off by one in #! shell style execution
+- Made it possible to disable auto_prepend/append with "none" filename
+- Allow safe CGI calling through #!php style scripts
+March 2 1998 Version 3.0b6
+- Made [s]printf handle %ld
+- Changed CGI version to only open regular files as input script
+- Added ignore_missing_userfunc_args directive to suppress warnings messages
+ about missing arguments to user-defined functions
+- Added Postgres function - pg_cmdtuples(), by Vladimir Litovka
+- Disabled command line options if used as CGI
+- Changed CGI version to use PATH_TRANSLATED as the script file name
+- Link with solid shared library instead of static one
+- Fixed a crash with functions that aren't being called correctly
+- Fixed file descriptor leak in auto-prepend/append
+- Imap module is usable. See README in dl/imap.
+February 24 1998 Version 3.0b5
+- Made the URL aware file functions be enabled by default
+- Fixed an unlikely crash bug in the parser, with uninitialized array elements
+ which are refered to as objects.
+- Fixed several fields that were being incorrectly read in Sybase CT.
+- Fix Apache-1.3 related SIGHUP problem which was preventing php3.ini from
+ getting re-read on a SIGHUP
+- *** WARNING *** Downwards incompatible change: The plus operator (+) is not
+ longer overloaded as concatenation for strings. Instead, it converts its
+ arguments to numbers and performs numeric addition.
+- Add Stig and Tin's bdf2gdfont script to extra/gd directory
+- Added join() as an alias to implode()
+- Made implode() accept arguments in the order used by explode() as well
+- Made $php_errormsg local in function calls
+- Fixed Apache configuration directive bugs
+- Added a number of .ini directives to Apache .conf directive list
+- Fixed a 'memory leak' with strtok()
+- echo/print now handle binary data correctly.
+- NEW now accepts any expression for the class name argument.
+- Add ImageDashedLine() GD function
+- Add arg_separator .ini directive so the '&' GET method separator can be
+ changed to ';' for example. Corresponding php3_arg_separator Apache .conf
+ directive works as well.
+- Walked around an implementation side effect of switch(). <? switch(expr) { ?>
+ now works.
+- Added memory caching, resulting in a significant performance boost
+- Added support for for(): .. endfor; loops
+- Added a new predicate - empty($var). Returns true if $var is not set,
+ or is FALSE. Returns false otherwise.
+- Added is_integer() (same as is_long()) and is_real() (same as is_double()).
+- Added sizeof() as an alias to the count() function
+- Added --enable-force-cgi-redirect, to prevent the CGI from working if
+ someone directly accesses PHP not through Apache's CGI redirect
+ (off by default).
+- Fixed marking of deleted dBase records. Noticed by Simon Gornall
+ <>.
+- Fixed fixed "%%" bug in [s]printf
+- Fixed a UMR (initialized memory read) in the Oracle code
+- Potential fix for mysql-related SIGPIPE problem which caused httpd to spin
+- Made PHP responsive to the Apache link status (stop executing if the link
+ dies).
+- Fixed a crash bug with StrongHold and secure pages
+- Fixed StrongHold installation
+- Optimized the function call sequence a bit.
+- Fixed Sybase/CT date/datetime/money fields work to correctly.
+- Fixed Apache module startup problems - php3_module_startup should only be
+ called once.
+- Fixed ord() with characters >127
+- Fixed bug in file_exists() function
+- Fixed stripslashes() to remove the escaping quote (instead of backslash)
+ in case magic_quotes_sybase is true.
+- Also make echo and print automatically remove trailing decimal zeros.
+- Added htmlentities(), currently handling only ISO-8859-1 entities
+- "0" is no longer considered false, the only string which is false is the
+ empty string "".
+- Added 'true' and 'false' keywords
+- Added 'xor' (logical exclusive or)
+- Automatic conversion from double to string removes decimal trailing zeros.
+- Added arsort() and rsort() to sort in descending order.
+- Turned on "XLATOPT_NOCNV" by default for uODBC/Solid.
+- Added support for a port number in the mysql_(p)connect() functions
+- Fixed a file descriptor leak in the configuration parser.
+- Fixed a few buglets with syntax highlighting with certain language keywords
+- Added functions to control minimum severity level of Sybase messages to
+ display.
+- Added highlight_string() - behaves like highlight_file(), only instead
+ of highlighting a file, it syntax highlights the contents of its
+ argument.
+- Renamed show_source() to highlight_file(). show_source() is still
+ supported for downwards compatability.
+- Fixed a bug in class inheritence - member functions with upper case
+ letters in their names couldn't be redefined.
+- Made chown(), chgrp() and chmod() return TRUE/FALSE instead of 0/-1.
+February 02 1998 Version 3.0b4
+- Fixed a segfault bug in one of the unified ODBC error messages.
+- Set default file modes to binary on Win32 (solved a lot of bs)
+- Fixed file copy on Win32
+- MIME file uploads fixed on Win32
+- Added contributed icons by Colin Viebrock (undex extra/icons)
+- Fixed the debugger enough to call it "beta code".
+- Fixed some leaks in the Oracle module, tidied up the code a bit.
+- Added __FILE__ and __LINE__ which evaluate to the currently parsed file
+ and currently parsed line respectively.
+- Added ImageColorAt(), ImageColorSet(), ImageColorsForIndex(), and
+ ImageColorsTotal() to allow manipulating the palette of GIF images.
+- Rename '--enable-url-includes' option to '--enable-url-fopen-wrapper' to
+ better describe what it does, and pay attention to the setting.
+- Added optional parameter to the file(), readfile() and fopen() functions
+ to look for files located in the include path.
+- Fixed bug that allowed the file() and readfile() to open files in the
+ include path inadvertantly.
+- Fixed a (documented) bug in printf()/sprintf() with hard limited strings
+ and alignment (e.g. %-.20s).
+- Optimized several quoted string routines.
+- Added error_log ini directive to select where errors get logged when
+ log_errors is turned on or the error_log() function is used.
+- Added the ability to direct errors to log files instead of or in addition
+ to the script output. Use the new display_errors and log_errors
+ php3.ini directives.
+- Made environment variables uneraseable by POST/GET/Cookie variables.
+- Fixed a bug in the elseif() construct. The expression was being evaluated
+ even if a previous if/elseif already evaluated to true and got executed.
+- Fixed a bug in the exit code parameter of system()
+- Tighten up all exec() related functions in safe mode
+- Added error_log() function to log messages to the server error log, or
+ stderr for the CGI version.
+- Added support for a general memory limit of scripts.
+- Fixed a segfault bug that occured under certain circumstances with shell
+ escapes ($foo = `...`)
+- Made keywords be valid property names of objects.
+- Fixed a segfault bug when creating new objects of an unknown class.
+- Fixed a problem with the maximum execution time limit, that may have
+ prevented this feature from working on certain platforms.
+- PHP would now warn you with E_NOTICE about unknown escape characters,
+ e.g. "\f". It would still be considered as a backslash followed by f,
+ but the proper way of writing this is "\\f" or '\f'.
+- Added support for ${...} inside encapsulated strings. Supported: ${foo},
+ ${foo[bar]}, ${foo[0]}, ${$foo[$bar]}, ${$foo->bar} and ${$foo}
+- Fixed a bug in automatic persistent link reconnect of the Sybase/DB module.
+ Thanks to Steve Willer for finding that 'stealth' bug!
+- Fixed a crash bug in the GET/POST/Cookie parser in case of regular
+ and array variables with the same name.
+- Added round() function.
+- Can't use encapsed strings as variable names anymore, ie. $"blah blah".
+- Fixed bug in gethostby*() functions that resulted in a core dump.
+ (Noticed by
+- Fixed bug in dbase_get_record that prevented number and date fields
+ from being properly decoded. (Thanks again to
+- Make dbase_get_record include a 'deleted' field that indicates whether
+ that record had been marked for deletion.
+- Fixed bug in dbase library that stomped on the deleted flag of the first
+ record in the file if it was set. (Thanks to
+- Fixed putenv() to not report a memory leak and possibly prevent a bug
+ from that memory being freed.
+- Added setlocale()
+- Added pg_fieldisnull() (by Stephan Duehr)
+- Changed pg_exec() to always return a result identifier on succees
+- Solid linking fixes (tries to find the right library)
+- Fixed a but with date() and the 'w' element.
+- Tried to eliminate unimportant memory leak notifications.
+- Made min() and max() backwards compatible and able to handle doubles.
+- Add fgetc() function
+- Fixed bug in getmyuid(), getmyinode() and getlastmod(). Thanks to
+ for pointing this out.
+- Fixed http:// URL includes with no path specified send request for /.
+- Added GetAllHeaders() (Apache-only)
+- Added workaround that made the Image text functions 8-bit clean
+- Made snmp internally compilable for Win32 (not the unix one though),
+ only adds 2k to binary size, so no reason not to have it there.
+- Fixed ldap loading on Win32
+- Fixed MySQL Info function on Win32 platform
+- Fixed compilation of syntax highlighting mode
+January 17 1998 Version 3.0b3
+- Added mysql support under windows ;) happy happy joy joy
+- Fixed dbase.dll for Win32 to actualy load now.
+- Enhanced the convertor to recognize ?> as a php-close-block as well.
+- Fixed potential SetCookie() core dumps
+- Changed print to be an expression instead of a statement. That means you can
+ now do stuff like foobar() or print("Unable to foobar!"). echo has NOT been
+ changed.
+- Removed the flex optimization flags to reduce the size of the scanner
+- Added memory leak logging into apache log files (apache module only)
+- Fixed a nasty bug in one of the internal stacks. This may have caused
+ random crashes in several occassions.
+- Fixed bug in ImageGif() making it hang sometimes
+- Added ImageLoadFont(), ImageFontWidth() and ImageFontHeight()
+- error_reporting() now returns the old error reporting level
+- Fixed url includes/opens not working under Win32
+- Fixed errorneous handling of multipart/form-data input
+- Added rawurlencode(), rawurldecode() and changed urlencode() and urldecode()
+ a bit too.
+- Fixed a bug in [s]printf, sign was forgotten for doubles.
+- Fixed a segfault bug in pg_fieldprtlen(), and made it accept field names
+ in addition to field offsets.
+- Made the setup script a little more user-friendly.
+- Added is_long(), is_double(), is_string(), is_array() and is_object()
+- Fixed a bug in freeing of mSQL results.
+- Improved pg_exec() to properly return true or false with queries that don't
+ return rows (i.e. insert, update, create, etc)
+- Added get_cfg_var() to enable checking cfg file directives from within
+ a script.
+- Fixed a bug with urlencode() and characters 0x80-0xff
+- Changed the behaviour of ereg_replace to more intuitive. The
+ backslashes other than valid existing back references in the second
+ argument are no more evaluated as escape sequences.
+- Fixed a bug in the configuration file loader and safe mode.
+- Fixed a bug with configuration variables taken from the environment.
+- Added <script language=php> </script> as PHP open/close tags, to allow
+ the use of editors such as Microsoft Frontpage.
+- Fixed a bug in the default php3.ini directory - it wasn't defaulting to
+ /usr/local/lib properly.
+- Added support for \r\n line endings
+- Fixed a bug that may have prevented POST method variables from working
+ with certain scripts when using the CGI version.
+- Convertor: Added support for single-quoted strings
+- Fixed segfault bug in the Adabas module, with queries that don't return
+ rows (update, insert, etc).
+December 22 1997 Version 3.0b2
+- Changed variable type conversions that do not specify base to always use
+ base 10. "010" is no more 8, it is 10. Use intval ($x, 0) to get C-style
+ octal and hex numbers recognized.
+- Fixed a possible segfault bug in several functions, when using the concat
+ operator and possibly other operators/functions.
+- # is no longer accepted as a comment in php3.ini. Use ; instead.
+- Added browscap support
+- Configuration file directives are now case-sensitive
+- Fixed msql_tablename() and msql_dbname()
+- Added a PHP/FI 2.0 -> PHP 3.0 convertor
+- Added support for shell/perl-style single quotes
+- Added support for execution of external programs using backquotes ($a=`ls -l`)
+- fixed mail() on windows, also fixed memory leaks in mail on windows
+- added sendmail_from to handle return route on windows
+- Changed the way the config file is searched. The file name is now
+ php3.ini (hardcoded), and it'll be looked for in: local directory, $PHPRC
+ and builtin path designated by ./configure under UNIX or Windows directory
+ under Windows.
+- Fixed ereg_replace replacing empty matches and a one off buffer overflow
+- Fixed File upload on windows platform
+- Fixed a bug that caused 'HTTP/1.1 100 Continue' messages with
+ Internet Explorer 4.0 and certain scripts that receive POST variables
+- Get/POST/Cookie data variables are from now *ALWAYS* strings. If you want
+ to use them in integer/real context, you must explicitly change their types.
+ This was done in order to avoid possible loss of data when doing these
+ conversions automatically.
+- Variables named as keywords are now allowed (e.g. $function, $class, etc)
+- Fixed a problem with msql() and mysql() with NULL fields
+- Fixed a segfault bug with class declarations
+- Fixed bugs with FOR loops and include() from within eval()
+- Changed include() to be executed conditionally. PHP-3.0 efficient
+ unconditional include is now require()
+December 08 1997 Version 3.0b1
+- Switched to public beta test phase
+- Generalized unset() and isset() to work on any type of variables, including
+ specific array indices or object properties (e.g., unset($a[4]) now works).
+- Added support for object references inside encapsulated strings
+ (for example, 'echo "Username: $user->name"' now works)
+- Added arbitary precision math support (basic operations with
+ unlimited range numbers, and support for unlimited decimal digits)
+- Apache module can now handle preprocessed scripts (by using:
+ AddType application/x-httpd-php3-preprocessed .php3p
+ in the Apache configuration)
+- Made settype() pass its first parameter by value. Improved it to be able
+ to convert to arrays and objects (originally by Steve Willer)
+- Implemented CPU time limit on scripts when setitimer() is available
+- Computed field names in the Sybase/CT and Sybase/DB modules are now named
+ computed, computed1, computed2, ...
+- Added Sybase/CT client/server message handlers and updated the Sybase/DB ones
+- Made the regexp function automatically take arguments by reference
+ when necessary
+- Added builtin support for auto append and prepend in the parser level
+- Improved the Sybase/CT sybase_query(). Should be more stable now, and
+ hopefully work with a wider range of queries. It's difficult to work
+ without docs, though, so it may still not be 100% right...
+- Changed error messages to show error type, file and line with bold
+- Added support for autoprepend and autoprepend
+- Added some more warning flags if gcc is used
+December 03 1997 Version 3.0a4
+- Improved the internal functions API - no need to explicitly pass
+ parameters by reference to internal functions that specifically
+ require them, e.g. sort(), ksort(), reset(), count(), etc.
+ This is *STILL* downwards compatible with the previous alphas,
+ in the sense that you can explicitly pass the arguments by reference
+ if you want to.
+- use srandom/random instead of srand/rand if available
+- Added [m,My]sql_listfields() for downwards compatability
+- -p now replaces .php3 extension with .php3p (otherwise it adds .php3p)
+- Added C++ style comments (// comment)
+- Fixed # commenting to terminate at a close PHP tag
+- Added \0 back reference for full string match to *reg*_replace and
+ added backslash escaping to replace string
+- Fixed a few bugs in the Sybase DB-library module.
+- Added Sybase CT-library support. It should be considered experimental.
+ Syntax is identical to the one of the DB-library. Allows people to
+ connect to MS-SQL servers from Linux without having to pay for a
+ library!
+- Beautified phpinfo()
+- Add ImageColorClosest() and ImageColorExact() GD functions
+- Make all .ini directives work as Apache .conf directives as well
+- Added PHP2-like File() function with PHP3 URL support
+- Upgraded the Sybase interface. It's practically MySQL compatible now!
+ Among other things, added sybase_fetch_array() and sybase_fetch_object().
+- Fixed problem in multi dimensional array handling and self modifying
+ operators (+=, -=, etc).
+- Safe Mode file open implementation
+- SVR3 portability problem fix
+November 23 1997 Version 3.0a3
+- Made the global statement behave like PHP 2 with undefined variables
+- Added msql_fetch_object() and msql_fetch_array()
+- Switched between the 1st and 2nd parameters to explode(), so that it acts
+ like split()
+- Fixed passthru(), exec() and system() functions
+- Implemented second optional parameter to intval() to specify conversion base
+ (The default is to assume you want to do a base 10 conversion.)
+- Implemented SQL safe mode for MySQL
+- Read UploadTmpDir from php3.ini instead of apache conf files
+- Added mysql_fetch_object() and mysql_fetch_array()
+- Changed function->old_function. function is now an alias to cfunction.
+- Split the magic_quotes directive to get/post/data and other
+- Added generic copy() function
+- Added a $GLOBALS[] array, which contains all global variables
+- Fix broken getimagesize() function
+- Made mysql_fetch_field() and msql_fetch_field() optionally accept a 2nd argument
+- Fixed mysql_data_seek() and msql_data_seek()
+- Changed list assignment to list(...) and array init to array(...)
+- Made <?php_track_vars?> work
+- cgi when not in debug mode uses regular malloc(), free() functions now
+- Added preliminary support for perl-style list assignments
+- Fixed a bug in mysql_result() and msql_result() when specifying table
+- renamed internal error-handling function and levels
+- Added basename and dirname functions similar to sh counterparts
+- Added base64_encode() and base64_decode()
+- Support Basic authorization for http url includes
+- Added parse_url() function to extract url components
+- Made it possible to use anonymous ftp on URL includes
+- Fixed url includes to handle different URLs better
+- Fixed mysql_field*() functions
+- Made mysql_connect() smarter, after a mysql_close() (applies to msql and pgsql too)
+November 6 1997 Version 3.0a2
+- Fixed a segfault bug caused by non-persistent connect in [m,My,Postgres]SQL modules
+- Fix command line argument handling
+- Made empty array list assignments work ($a=({});)
+- Made '$' escaping optional when a variable name parsing isn't possible
+- Added support for mysql_[p]connect(host) and mysql_[p]connect(host,user)
+- New layout in phpinfo()
+- Update Oracle extension to use php3_list functions
+- Add includepath support
+- Add #!php shell script escape support
+- Change name of CGI/command line version from php3.cgi to php
+- Add SNMP extension
+- show_source() support
+- Parsing of command-line args for CGI version
+- Support for backreferences in ereg_replace
+- Support for hexadecimal numbers directly at the scanner level
+- Support octal numbers directly at the scanner level
+- Fixed problem with huge html files (with little or no php code)
+- Fix eval() empty string argument core dump
+- renamed 'install' to 'setup' to be more accurate and avoid name conflict
+- Fixed Oracle compilation
+- Fixed mSQL 1.0 compilation
+- Fixed a problem in the mSQL, MySQL and PostgresSQL drivers and NULL fields.
+- Fixed the GLOBAL statement to be able to declare an array.
+October 29 1997 Version 3.0a1
+- Start with excellent new parser from Andi and Zeev
@@ -0,0 +1,54 @@
+The core of PHP 3.0 is considered to be stable at this time. However, some of
+the modules that are bundled with it are still undergoing development, or
+contain known bugs. The purpose of this file is to document the status of
+each module (extension). Patches to unstable modules will be available through
+the CVS, and through periodic maintenance releases.
+Stability scale:
+Rock solid - We believe it's safe to base a production site on it.
+Stable - It should be safe to base a production site on it.
+ Isn't rated as rock-solid because it contained problems
+ in the not-so-far past, or doesn't have enough users
+ to test it to know it's rock solid.
+Beta - This module probably contains bugs, sometimes even known
+ bugs. You can give it a try and there's a good chance
+ it'll work fine, but it might not be a good idea to base
+ a production site on it.
+Alpha - This module is in initial development steps. Don't trust
+ it, play with it at your own risk.
+Deprecated - This module is only available for downwards compatability,
+ and will not be supported in any way. The code quality
+ is usually around the Beta status.
+The standard disclaimers apply, that is, if a rock-solid module blows up on
+you and ruins your site, nobody in the PHP development team is responsible.
+We'll probably try to help, though.
+Extension Name Status Comments
+DBM Rock Solid That relies on a working DBM library.
+ The flatfile support is probably not
+ as stable.
+MySQL Rock Solid
+mSQL Rock Solid
+Sybase DB Stable
+Sybase CT Stable
+BC Math Rock Solid Arbitary precision math library
+Postgres SQL Stable Postgres 6.2 and earlier is stable,
+ but problems were reported with 6.3
+Debugger Beta
+Unified ODBC Beta
+Solid Deprecated Replaced by Unified ODBC
+iODBC Deprecated Replaced by Unified ODBC
+Adabas Deprecated Replaced by Unified ODBC
+LDAP Stable Lightweight Directory Access Protocol.
+Oracle Beta Not tested thoroughly enough.
+IMAP Beta Bundled in the dl/ directory
+SNMP Stable Very solid, but also very limited.
+ Only supports GET and WALK requests.
+Raima Velocis Beta If use with Unified ODBC, replaced
+ by Unified ODBC
+Raima Velocis Alpha If use without Unified ODBC
@@ -0,0 +1,538 @@
+Functions marked with 'u' do not work, or may not work correctly under windows.
+ include
+ _include
+ isset
+ intval
+ doubleval
+ strval
+ short_tags
+ sleep
+u usleep
+ ksort
+ asort
+ sort
+ count
+ chr
+ ord
+ flush
+ end
+ prev
+ next
+ reset
+ current
+ key
+ gettype
+ settype
+ min
+ max
+ addslashes
+ chop
+ pos
+ fsockopen
+ getimagesize
+ htmlspecialchars
+ md5
+ parse_url
+ parse_str
+ phpinfo
+ phpversion
+ strlen
+ strtok
+ strtoupper
+ strtolower
+ strchr
+ basename
+ dirname
+ stripslashes
+ strstr
+ strrchr
+ substr
+ quotemeta
+ urlencode
+ urldecode
+ ucfirst
+ strtr
+ sprintf
+ printf
+ exec
+ system
+ escapeshellcmd
+ passthru
+ soundex
+ rand
+ srand
+ getrandmax
+ gethostbyaddr
+ gethostbyname
+ explode
+ implode
+ error_reporting
+ clearstatcache
+ get_current_user
+ getmyuid
+ getmypid
+u getmyinode
+ getlastmod
+ base64_decode
+ base64_encode
+ abs
+ ceil
+ floor
+ sin
+ cos
+ tan
+ asin
+ acos
+ atan
+ pi
+ pow
+ exp
+ log
+ log10
+ sqrt
+ bindec
+ hexdec
+ octdec
+ decbin
+ decoct
+ dechex
+ getenv
+ putenv
+ time
+ mktime
+ date
+ gmdate
+ getdate
+ checkdate
+ microtime
+ uniqid
+u linkinfo
+u readlink
+u symlink
+u link
+u unlink
+ bcadd
+ bcsub
+ bcmul
+ bcdiv
+ bcmod
+ bcpow
+ bcsqrt
+ bcscale
+ bccomp
+ opendir
+ closedir
+ chdir
+ rewinddir
+ readdir
+ dir
+ dl(string module_name); dynamicly load a module
+ gethostbyaddr
+ gethostbyname
+ pclose
+ popen
+ readfile
+ rewind
+ rmdir
+ umask
+ fclose
+ feof
+ fgets
+ fgetss
+ fopen
+ fpassthru
+ fseek
+ ftell
+ fputs
+ mkdir
+ rename
+ copy
+ tempnam
+ file
+ fileatime
+ filectime
+u filegroup
+u fileinode
+ filemtime
+u fileowner
+ fileperms
+ filesize
+ filetype
+ stat
+u chown
+u chgrp
+u chmod
+ touch
+ file_exists
+ is_executable
+ is_dir
+ is_readable
+ is_writeable
+u is_link
+ setcookie
+ header
+ mail
+ ereg
+ ereg_replace
+ eregi
+ eregi_replace
+ split
+ sql_regcase
+syslog_functions (writes to event log on win NT)
+ openlog
+ syslog
+ closelog
+The following are optional modules and may or may not be compiled into php, or may be compiled as a loadable module.
+odbc_functions (obsolete, use uodbc below)
+ sqlconnect
+ sqldisconnect
+ sqlfetch
+ sqlexecdirect
+ sqlgetdata
+ sqlfree
+ sqlrowcount
+ (int) odbc_autocommit($connection_id, $OnOff)
+ (void) odbc_close($connection_id)
+ (void) odbc_close_all(void)
+ (int) odbc_commit($connection_id)
+ (int) odbc_connect($dsn, $user, $password)
+ (int) odbc_pconnect($dsn, $user, $password)
+ (string) odbc_cursor($result_id)
+ (int) odbc_do($connection_id, $query_string)
+ (int) odbc_exec($connection_id, $query_string)
+ (int) odbc_prepare($connection_id, $query_string)
+ (int) odbc_execute($result_id, $array)
+ (int) odbc_fetch_row($result_id, $row_number)
+ (int) odbc_fetch_into($result_id, $row_number, $array_ptr)
+ (int) odbc_field_len($result_id, $field_number)
+ (string) odbc_field_name($result_id, $field_number)
+ (string) odbc_field_type($result_id, $field)
+ (int) odbc_free_result($result_id)
+ (int) odbc_num_fields($result_id)
+ (int) odbc_num_rows($result_id)
+ (string) odbc_result($result_id, $field)
+ (int) odbc_result_all($result_id, $format)
+ (int) odbc_rollback($connection_id)
+ msql_connect
+ msql_pconnect
+ msql_close
+ msql_select_db
+ msql_create_db
+ msql_drop_db
+ msql_query
+ msql
+ msql_list_dbs
+ msql_list_tables
+ msql_list_fields
+ msql_result
+ msql_num_rows
+ msql_num_fields
+ msql_fetch_row
+ msql_fetch_array
+ msql_fetch_object
+ msql_data_seek
+ msql_fetch_field
+ msql_field_seek
+ msql_free_result
+ msql_fieldname
+ msql_fieldtable
+ msql_fieldlen
+ msql_fieldtype
+ msql_fieldflags
+ msql_regcase
+ /* for downwards compatability */
+ msql_selectdb
+ msql_createdb
+ msql_dropdb
+ msql_freeresult
+ msql_numfields
+ msql_numrows
+ msql_listdbs
+ msql_listtables
+ msql_listfields
+ msql_dbname
+ msql_tablename
+ ldap_connect
+ ldap_bind
+ ldap_unbind
+ ldap_read
+ ldap_list
+ ldap_search
+ ldap_free_result
+ ldap_count_entries
+ ldap_first_entry
+ ldap_next_entry
+ ldap_get_entries
+ ldap_free_entry
+ ldap_first_attribute
+ ldap_next_attribute
+ ldap_get_attributes
+ ldap_get_values
+ ldap_get_dn
+ ldap_dn2ufn
+ ldap_add
+ ldap_delete
+ ldap_modify
+ imagearc
+ imagechar
+ imagecharup
+ imagecolorallocate
+ imagecolorclosest
+ imagecolorexact
+ imagecolortransparent
+ imagecopyresized
+ imagecreate
+ imagecreatefromgif
+ imagedestroy
+ imagefill
+ imagefilledpolygon
+ imagefilledrectangle
+ imagefilltoborder
+ imagegif
+ imageinterlace
+ imageline
+ imagepolygon
+ imagerectangle
+ imagesetpixel
+ imagestring
+ imagestringup
+ imagesx
+ imagesy
+ filepro
+ filepro_rowcount
+ filepro_fieldname
+ filepro_fieldtype
+ filepro_fieldwidth
+ filepro_fieldcount
+ filepro_retrieve