Annotation of embedaddon/php/UPGRADING, revision 1.1.1.2

1.1.1.2 ! misho       1: $Id$
1.1       misho       2: 
1.1.1.2 ! misho       3: PHP 5.4 UPGRADE NOTES
1.1       misho       4: 
1.1.1.2 ! misho       5: ===========
        !             6: 0. Contents
        !             7: ===========
        !             8: 
        !             9: 1. Changes to INI directives
        !            10: 2. Changes to reserved words and classes
        !            11: 3. Changes to engine behavior
        !            12: 4. Changes to existing functions
        !            13: 5. Changes to existing classes
        !            14: 6. Changes to existing methods
        !            15: 7. Deprecated Functionality
        !            16: 8. Removed Functionality
        !            17:      a. Removed features
        !            18:      b. Removed functions
        !            19:      c. Removed syntax
        !            20:      d. Removed hash algorithms
        !            21: 9. Extension Changes:
        !            22:      a. Extensions no longer maintained
        !            23:      b. Extensions with changed behavior
        !            24: 10. Changes in SAPI support
1.1       misho      25: 11. Windows support
1.1.1.2 ! misho      26: 12. New in PHP 5.4:
        !            27:      a. New features
        !            28:      b. Syntax additions
        !            29:      c. New functions
        !            30:      d. New global constants
        !            31:      e. New classes
        !            32:      f. New methods
        !            33:      g. New hash algorithms
1.1       misho      34: 
                     35: =============================
1.1.1.2 ! misho      36: 1. Changes to INI directives
1.1       misho      37: =============================
                     38: 
1.1.1.2 ! misho      39: - PHP 5.4 now checks at compile time if /dev/urandom or /dev/arandom
        !            40:   are present.  If either is available, session.entropy_file now
        !            41:   defaults to that file and session.entropy_length defaults to 32.
        !            42:   This provides non-blocking entropy to session id generation.  If you
        !            43:   do not want extra entropy for your session ids, add:
        !            44: 
        !            45:     session.entropy_file=
        !            46:     session.entropy_length=0
        !            47: 
        !            48:   to your php.ini to preserve pre-PHP 5.4 behavior.
        !            49: 
        !            50: - Deprecated php.ini directives will now throw an E_CORE_WARNING's
        !            51:   instead of the previous E_WARNING's.
        !            52: 
        !            53: - The following php.ini directives are no longer available in PHP 5.4
        !            54:   and will now throw an E_CORE_ERROR upon startup:
        !            55:   - allow_call_time_pass_reference
        !            56:   - define_syslog_variables
        !            57:   - highlight.bg
        !            58:   - magic_quotes_gpc
        !            59:   - magic_quotes_runtime
        !            60:   - magic_quotes_sybase
        !            61:   - register_globals
        !            62:   - register_long_arrays
        !            63:   - safe_mode
        !            64:   - safe_mode_gid
        !            65:   - safe_mode_include_dir
        !            66:   - safe_mode_exec_dir
        !            67:   - safe_mode_allowed_env_vars
        !            68:   - safe_mode_protected_env_vars
        !            69:   - session.bug_compat_42
        !            70:   - session.bug_compat_warn
        !            71:   - y2k_compliance
        !            72:   - zend.ze1_compatibility_mode
        !            73: 
        !            74: - the following new php.ini directives were added:
        !            75:   - max_input_vars - specifies how many GET/POST/COOKIE input
        !            76:     variables may be accepted. The default value is 1000.
        !            77: 
        !            78: - E_ALL now includes E_STRICT.
        !            79: 
        !            80: - The recommended production value for error_reporting changed to E_ALL &
        !            81:   ~E_DEPRECATED & ~E_STRICT.
        !            82: 
        !            83: - Added new session support directives:
        !            84:     session.upload_progress.enabled
        !            85:     session.upload_progress.cleanup
        !            86:     session.upload_progress.prefix
        !            87:     session.upload_progress.name
        !            88:     session.upload_progress.freq
        !            89:     session.upload_progress.min_freq
        !            90: 
        !            91: - Added a zend.multibyte directive as a replacement of the PHP compile time
        !            92:   configuration option --enable-zend-multibyte.  Now the Zend Engine always
        !            93:   contains code for multibyte support, which can be enabled or disabled at
        !            94:   runtime.  Note: It doesn't make a lot of sense to enable this option if
        !            95:   ext/mbstring is not enabled, because most functionality is implemented by
        !            96:   mbstrings callbacks.
        !            97: 
        !            98: - Added zend.script_encoding. This value will be used unless a
        !            99:   "declare(encoding=...)" directive appears at the top of the script.
        !           100: 
        !           101: - Added zend.signal_check to check for replaced signal handlers on shutdown
        !           102: 
        !           103: - Added enable_post_data_reading, which is enabled by default. When it's
        !           104:   disabled, the POST data is not read (or processed); the behavior is similar
        !           105:   to that of other request methods with body, like PUT. This allows reading
        !           106:   the raw POST data in multipart requests and reading/processing the POST data
        !           107:   in a stream fashion (through php://input) without having it copied in memory
        !           108:   multiple times.
        !           109: 
        !           110: - Added windows_show_crt_warning.  This directive shows the CRT warnings when
        !           111:   enabled. These warnings were displayed by default until now. It is disabled
        !           112:   by default.
        !           113: 
        !           114: - Added cli.pager to set a pager for CLI interactive shell output.
        !           115: 
        !           116: - Added cli.prompt to configure the CLI interactive shell prompt.
        !           117: 
        !           118: - Added cli_server.color to enable the CLI web server to use ANSI color coding
        !           119:   in terminal output.
        !           120: 
        !           121: ========================================
        !           122: 2. Changes to reserved words and classes
        !           123: ========================================
1.1       misho     124: 
1.1.1.2 ! misho     125: - "callable", "insteadof" and "trait" are now reserved words.
1.1       misho     126: 
1.1.1.2 ! misho     127: =============================
        !           128: 3. Changes to engine behavior
        !           129: =============================
1.1       misho     130: 
1.1.1.2 ! misho     131: - The __construct arguments of an extended abstract constructor must
        !           132:   now match:
1.1       misho     133: 
1.1.1.2 ! misho     134:   abstract class Base
        !           135:   {
        !           136:     abstract public function __construct();
        !           137:   }
        !           138:   class Foo extends Base
        !           139:   {
        !           140:     public function __construct($bar) {}
        !           141:   }
        !           142: 
        !           143:   This now emits a Fatal error due the incompatible declaration.
        !           144: 
        !           145: - In previous versions, superglobal names could be used for parameter
        !           146:   names, thereby shadowing the corresponding superglobal. In PHP 5.4
        !           147:   this now causes a fatal error such as "Cannot re-assign auto-global
        !           148:   variable GLOBALS".
        !           149: 
        !           150: - Turning null, false or an empty string into an object by adding a
        !           151:   property will now emit a warning instead of an E_STRICT error.
        !           152: 
        !           153:   $test = null;
        !           154:   $test->baz = 1;
        !           155: 
        !           156:   To create a generic object you can use StdClass:
        !           157: 
        !           158:   $test = new StdClass;
        !           159:   $test->baz = 1;
        !           160: 
        !           161: - Converting an array to a string now will cause an E_NOTICE warning.
        !           162: 
        !           163: - Non-numeric string offsets, e.g. $a['foo'] where $a is a string, now
        !           164:   return false on isset() and true on empty(), and produce warning if
        !           165:   trying to use them.  Offsets of types double, bool and null produce
        !           166:   notice. Numeric strings ($a['2']) still work as before.
        !           167: 
        !           168:   Note that offsets like '12.3' and '5 and a half' are considered
        !           169:   non-numeric and produce warning, but are converted to 12 and 5
        !           170:   respectively for backwards compatibility reasons.
        !           171: 
        !           172: - Closures now support scopes and $this and can be rebound to
        !           173:   objects using Closure::bind() and Closure::bindTo().
        !           174: 
        !           175: - <?= is now always available regardless of the short_open_tag
        !           176:   setting.
        !           177: 
        !           178: - Parse error messages are changed to contain more information about
        !           179:   the error.
        !           180: 
        !           181: ================================
        !           182: 4. Changes to existing functions
        !           183: ================================
        !           184: 
        !           185: - array_combine now returns array() instead of FALSE when two empty arrays are
        !           186:   provided as parameters.
        !           187: 
        !           188: - dns_get_record() has an extra parameter which allows requesting DNS records
        !           189:   by numeric type and makes the result include only the raw data of the
        !           190:   response.
        !           191: 
        !           192: - call_user_func_array() no longer allows call-time pass by reference.
        !           193: 
        !           194: - the default character set for htmlspecialchars() and htmlentities() is
        !           195:   now UTF-8. In previous versions it was ISO-8859-1. Note that changing
        !           196:   your output charset via the php.ini default_charset directive does not
        !           197:   affect htmlspecialchars/htmlentities unless you are passing "" (an 
        !           198:   empty string) as the encoding parameter to your htmlspecialchars/htmlentities
        !           199:   calls. 
        !           200: 
        !           201: - htmlentities() and htmlspecialchars() are stricter in the code units they
        !           202:   accept for the asian encodings. For Big5-HKSCS, the octets 0x80 and 0xFF are
        !           203:   rejected.  For GB2312/EUC-CN, the octets 0x8E, 0x8F, 0xA0 and 0xFF are
        !           204:   rejected. For SJIS, the octets 0x80, 0xA0, 0xFD, 0xFE and 0xFF are rejected,
        !           205:   except maybe after a valid starting byte. For EUC-JP, the octets 0xA0 and
        !           206:   0xFF are rejected.
        !           207: 
        !           208: - htmlentities() now emits an E_STRICT warning when used with asian characters,
        !           209:   as in that case htmlentities has (and already had before this version) the
        !           210:   same functionality as htmlspecialchars.
        !           211: 
        !           212: - htmlentities() no longer numerically encodes high characters for single-byte
        !           213:   encodings (except when there's actually a corresponding named entity). This
        !           214:   behavior was not documented and was inconsistent with that for "UTF-8".
        !           215: 
        !           216: - html_entity_decode() and htmlspecialchars_decode() behave more consistently,
        !           217:   now decoding entities in malformed strings such as "&&amp;" or "&#&amp;".
        !           218: 
        !           219: - htmlentities(), htmlspecialchars(), html_entity_decode(), and
        !           220:   htmlspecialchars_decode: Added the flags ENT_HTML401, ENT_XML1, ENT_XHTML,
        !           221:   and ENT_HTML5. The behavior of these functions including, but not limited to,
        !           222:   the characters that are encoded and the entities that are decoded depend on
        !           223:   the document type that is specified by those flags.
        !           224: 
        !           225: - htmlentities() and htmlspecialchars() with !$double_encode do more strict
        !           226:   checks on the validity of the entities. Numerical entities are checked for a
        !           227:   valid range (0 to 0x10FFFF); if the flag ENT_DISALLOWED is given, the
        !           228:   validity of such numerical entity in the target document type is also
        !           229:   checked.  Named entities are checked for necessary existence in the target
        !           230:   document type instead of only checking whether they were constituted by
        !           231:   alphanumeric characters.
        !           232: 
        !           233: - The flag ENT_DISALLOWED was added. In addition to the behavior described in
        !           234:   the item before, it also makes htmlentities() and htmlspecialchars()
        !           235:   substitute characters that appear literally in the argument string and which
        !           236:   are not allowed in the target document type with U+FFFD (UTF-8) or &#xFFFD;.
        !           237: 
        !           238: - The flag ENT_SUBSTITUTE was added. This flag makes invalid multibyte
        !           239:   sequences be replaced by U+FFFD (UTF-8) or &#FFFD; by htmlspecialchars() and
        !           240:   htmlentities(). It is an alternative to the default behavior, which just
        !           241:   returns an empty string and to ENT_IGNORE, which is a security risk. The
        !           242:   behavior follows the recommendations of Unicode Technical Report #36.
        !           243: 
        !           244: - htmlspecialchars_decode() and html_entity_decode() now decode &apos; if the
        !           245:   document type is ENT_XML1, ENT_XHTML, or ENT_HTML5.
        !           246: 
        !           247: - Charset detection with $charset == '' no longer turns to mbstring's
        !           248:   internal encoding defined through mb_internal_encoding(). Only the encoding
        !           249:   defined through the php.ini setting mbstring.internal_encoding is considered.
        !           250: 
        !           251: - number_format() no longer truncates multibyte decimal points and thousand
        !           252:   separators to the first byte.
        !           253: 
        !           254: - The third parameter ($matches) to preg_match_all() is now optional. If
        !           255:   omitted, the function will simply return the number of times the pattern was
        !           256:   matched in the subject and will have no other side effects.
        !           257: 
        !           258: - The second argument of scandir() now accepts SCANDIR_SORT_NONE (2) as a
        !           259:   possible value. This value results in scandir() performing no sorting: on
        !           260:   local filesystems, this allows files to be returned in native filesystem
        !           261:   order.
        !           262: 
        !           263: - stream_select() now preserves the keys of the passed array, be they numeric or
        !           264:   strings. This breaks code that iterated the resulting stream array using a
        !           265:   numeric index, but makes easier to identify which of the passed streams are
        !           266:   present in the result.
        !           267: 
        !           268: - stream_set_write_buffer() no longer disables the read buffer of a plain
        !           269:   stream when 0 is given as the second argument.
        !           270: 
        !           271: - stream_set_write_buffer() no longer changes the chunk size in socket streams.
        !           272: 
        !           273: - fclose() closes streams with resource refcount > 1; it doesn't merely
        !           274:   decrement the resource refcount.
        !           275: 
        !           276: - socket_set_options() and socket_get_options() now support multicast options.
        !           277: 
        !           278: - The raw data parameter in openssl_encrypt() and openssl_decrypt() is now an
        !           279:   options integer rather than a boolean. A value of true produces the same
        !           280:   behavior.
1.1       misho     281: 
                    282: - Write operations within XSLT (for example with the extension sax:output) are
1.1.1.2 ! misho     283:   disabled by default. You can define what is forbidden with the method
        !           284:   XsltProcess::setSecurityPrefs($options).
1.1       misho     285: 
1.1.1.2 ! misho     286: - Added AES support to OpenSSL.
1.1       misho     287: 
1.1.1.2 ! misho     288: - openssl_csr_new() expects the textual data to be in UTF-8.
1.1       misho     289: 
1.1.1.2 ! misho     290: - Added no-padding option to openssl_encrypt() and openssl_decrypt().
1.1       misho     291: 
1.1.1.2 ! misho     292: - Added a "no_ticket" SSL context option to disable the SessionTicket TLS
        !           293:   extension.
1.1       misho     294: 
1.1.1.2 ! misho     295: - Added new json_encode() options: JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES,
        !           296:   JSON_NUMERIC_CHECK, JSON_BIGINT_AS_STRING, JSON_UNESCAPED_UNICODE.
1.1       misho     297: 
1.1.1.2 ! misho     298: - Added Tokyo Cabinet and Berkley DB 5 support to DBA extension.
1.1       misho     299: 
1.1.1.2 ! misho     300: - Added support for CURLOPT_MAX_SEND_SPEED_LARGE and CURLOPT_MAX_RECV_SPEED_LARGE
        !           301:   to cURL.
1.1       misho     302: 
1.1.1.2 ! misho     303: - Added optional argument to debug_backtrace() and debug_print_backtrace()
        !           304:   to limit the amount of stack frames returned.
1.1       misho     305: 
1.1.1.2 ! misho     306: - Fixed crypt_blowfish handling of 8-bit characters. crypt() in Blowfish mode
        !           307:   now supports hashes marked $2a$, $2x$, $2y$ and $2z$.
1.1       misho     308: 
1.1.1.2 ! misho     309: - mbstring now supports following encodings: Shift_JIS/UTF-8 Emoji,
        !           310:   JIS X0213:2004 (Shift_JIS-2004, EUC-JP-2004, ISO-2022-JP-2004),
        !           311:   MacJapanese (Shift_JIS), gb18030.
1.1       misho     312: 
1.1.1.2 ! misho     313: - Added encode and decode in hex format to mb_encode_numericentity() and
        !           314:   mb_decode_numericentity().
1.1       misho     315: 
1.1.1.2 ! misho     316: - Added support for SORT_NATURAL and SORT_FLAG_CASE in array sort functions:
        !           317:   sort(), rsort(), ksort(), krsort(), asort(), arsort() and array_multisort().
1.1       misho     318: 
1.1.1.2 ! misho     319: - is_a() and is_subclass_of() now have third boolean parameter, which specifies
        !           320:   if the first argument can be a string class name. Default if false for is_a
        !           321:   and true for is_subclass_of() for BC reasons.
1.1       misho     322: 
1.1.1.2 ! misho     323: - ob_start() will now treat a chunk size of 1 as meaning 1 byte, rather than
        !           324:   the previous special case behavior of treating it as 4096 bytes.
1.1       misho     325: 
1.1.1.2 ! misho     326: - idn_to_ascii() and idn_to_utf8() now take two extra parameters, one indicating
        !           327:   the variant (IDNA 2003 or UTS #46) and another, passed by reference, to return
        !           328:   details about the operation in case UTS #46 is chosen.
1.1       misho     329: 
1.1.1.2 ! misho     330: - gzencode() used with FORCE_DEFLATE now generates RFC1950 compliant data.
1.1       misho     331: 
1.1.1.2 ! misho     332: - ob_start() no longer starts multiple output buffers when passed
        !           333:   array("callback1", "callback2", "callback3", ...).
1.1       misho     334: 
1.1.1.2 ! misho     335: ==============================
        !           336: 5. Changes to existing classes
        !           337: ==============================
1.1       misho     338: 
1.1.1.2 ! misho     339: - Classes that implement stream wrappers can define a method called
        !           340:   stream_truncate that will respond to truncation, e.g. through ftruncate.
        !           341:   Strictly speaking, this is an addition to the user-space stream wrapper
        !           342:   template, not a change to an actual class.
1.1       misho     343: 
1.1.1.2 ! misho     344: - Classes that implement stream wrappers can define a method called
        !           345:   stream_metadata that will be called on touch(), chmod(), chgrp(), chown().
1.1       misho     346: 
1.1.1.2 ! misho     347: - Arrays cast from SimpleXMLElement now always contain all nodes instead of
        !           348:   just the first matching node.
1.1       misho     349: 
1.1.1.2 ! misho     350: - All SimpleXMLElement children are now always printed when using var_dump(),
        !           351:   var_export(), and print_r().
1.1       misho     352: 
1.1.1.2 ! misho     353: - Added iterator support in MySQLi. mysqli_result implements Traversable.
1.1       misho     354: 
1.1.1.2 ! misho     355: ==============================
        !           356: 6. Changes to existing methods
        !           357: ==============================
1.1       misho     358: 
1.1.1.2 ! misho     359: - DateTime::parseFromFormat() now has a "+" modifier to allow trailing text in
        !           360:   the string to parse without throwing an error.
1.1       misho     361: 
1.1.1.2 ! misho     362: - Added the ability to pass options to DOMDocument::loadHTML().
1.1       misho     363: 
1.1.1.2 ! misho     364: - FilesystemIterator, GlobIterator and (Recursive)DirectoryIterator now use
        !           365:   the default stream context.
1.1       misho     366: 
1.1.1.2 ! misho     367: ===========================
        !           368: 7. Deprecated Functionality
        !           369: ===========================
1.1       misho     370: 
1.1.1.2 ! misho     371: - The following functions are deprecated in PHP 5.4:
        !           372:   - mcrypt_generic_end():       use mcrypt_generic_deinit() instead
        !           373:   - mysql_list_dbs()
1.1       misho     374: 
1.1.1.2 ! misho     375: ========================
        !           376: 8. Removed Functionality
        !           377: ========================
1.1       misho     378: 
1.1.1.2 ! misho     379: a. Removed features
1.1       misho     380: 
1.1.1.2 ! misho     381:    The following features have been removed from PHP 5.4:
1.1       misho     382: 
1.1.1.2 ! misho     383:    - Magic quotes
        !           384:    - Register globals
        !           385:    - Safe mode
        !           386:    - Session extension bug compatibility mode
        !           387:    - Y2K compliance mode
1.1       misho     388: 
1.1.1.2 ! misho     389: b. Removed functions
1.1       misho     390: 
1.1.1.2 ! misho     391:    The following functions are no longer available in PHP 5.4:
1.1       misho     392: 
1.1.1.2 ! misho     393:    - define_syslog_variables()
        !           394:    - import_request_variables()
        !           395:    - session_is_registered()
        !           396:    - session_register()
        !           397:    - session_unregister()
        !           398:    - set_magic_quotes_runtime()
        !           399:    - mysqli_bind_param() (alias of mysqli_stmt_bind_param())
        !           400:    - mysqli_bind_result() (alias of mysqli_stmt_bind_result())
        !           401:    - mysqli_client_encoding() (alias of mysqli_character_set_name())
        !           402:    - mysqli_fetch() (alias of mysqli_stmt_fetch())
        !           403:    - mysqli_param_count() (alias of mysqli_stmt_param_count())
        !           404:    - mysqli_get_metadata() (alias of mysqli_stmt_result_metadata())
        !           405:    - mysqli_send_long_data() (alias of mysqli_stmt_send_long_data())
        !           406:    - mysqli::client_encoding() (alias of mysqli::character_set_name)
        !           407:    - mysqli_stmt::stmt() (never worked/always throws, undocumented)
1.1       misho     408: 
1.1.1.2 ! misho     409: c. Removed syntax
1.1       misho     410: 
1.1.1.2 ! misho     411:    - break $var;
        !           412:    - continue $var;
1.1       misho     413: 
1.1.1.2 ! misho     414: d. Removed hash algorithms
1.1       misho     415: 
1.1.1.2 ! misho     416:    - Salsa10 and Salsa20, which are actually stream ciphers
1.1       misho     417: 
                    418: ====================
1.1.1.2 ! misho     419: 9. Extension Changes
1.1       misho     420: ====================
                    421: 
1.1.1.2 ! misho     422: a. Extensions no longer maintained
1.1       misho     423: 
1.1.1.2 ! misho     424:    - ext/sqlite is no longer part of the base distribution and has been moved
        !           425:      to PECL.  Use sqlite3 or PDO_SQLITE instead.
1.1       misho     426: 
1.1.1.2 ! misho     427: b. Extensions with changed behavior
1.1       misho     428: 
1.1.1.2 ! misho     429:    - The MySQL extensions (ext/mysql, mysqli and PDO_MYSQL) use mysqlnd
        !           430:      as the default library now. It is still possible to use libmysql by
        !           431:      specifying a path to the configure options.
        !           432: 
        !           433:    - PDO_MYSQL: Support for linking with MySQL client libraries older
        !           434:      than 4.1 is removed.
        !           435: 
        !           436:    - The session extension now can hook into the file upload feature
        !           437:      in order to provide upload progress information through session
        !           438:      variables.
        !           439: 
        !           440:    - SNMP extension
        !           441:      - Functions in SNMP extension now returns FALSE on every error
        !           442:        condition including SNMP-related (no such instance, end of MIB,
        !           443:        etc). Thus, in patricular, breaks previous behavior of get/walk
        !           444:        functions returning an empty string on SNMP-related errors.
        !           445:      - Multi OID get/getnext/set queries are now supported.
        !           446:      - New constants added for use in snmp_set_oid_output_format()
        !           447:        function.
        !           448:      - Function snmp_set_valueretrieval() changed it's behavior:
        !           449:            SNMP_VALUE_OBJECT can be combined with one of
        !           450:            SNMP_VALUE_PLAIN or SNMP_VALUE_LIBRARY resulting OID value
        !           451:            changes. When no SNMP_VALUE_PLAIN or SNMP_VALUE_LIBRARY
        !           452:            is supplied with SNMP_VALUE_OBJECT, SNMP_VALUE_LIBRARY is used.
        !           453:            Prior to 5.4.0 when no SNMP_VALUE_PLAIN or SNMP_VALUE_LIBRARY
        !           454:            was supplied with SNMP_VALUE_OBJECT, SNMP_VALUE_PLAIN was used.
        !           455:      - Added feature-rich OO API (SNMP class)
        !           456:      - Dropped UCD-SNMP compatibility code. Consider upgrading to
        !           457:        net-snmp v5.3+. Net-SNMP v5.4+ is required for Windows version.
        !           458:      - In sake of adding support for IPv6 DNS name resolution of
        !           459:        remote SNMP agent (peer) is done by extension now, not by Net-SNMP
        !           460:        library anymore.
        !           461: 
        !           462:    - Date extension
        !           463:      - Setting the timezone with the TZ environment variable is no longer
        !           464:        supported, instead date.timezone and/or date_default_timezone_set()
        !           465:        have to be used.
        !           466:      - The extension will no longer guess the default timezone if none
        !           467:        is set with date.timezone and/or date_default_timezone_set().
        !           468:        Instead it will always fall back to "UTC".
        !           469: 
        !           470:    - Hash extension
        !           471:      - the output of the tiger hash family has been corrected, see
        !           472:        https://bugs.php.net/61307
        !           473: 
        !           474: ===========================
        !           475: 10. Changes in SAPI support
        !           476: ===========================
        !           477: 
        !           478: - A REQUEST_TIME_FLOAT value returns a floating point number indicating the
        !           479:   time with microsecond precision.  All SAPIs providing this value should be
        !           480:   returning float and not time_t.
        !           481: 
        !           482: - apache_child_terminate(), getallheaders(), apache_request_headers()
        !           483:   and apache_response_headers() are now supported on FastCGI.
        !           484: 
        !           485: - The interactive shell allows a shortcut #inisetting=value to change php.ini
        !           486:   settings at run-time.
1.1       misho     487: 
1.1.1.2 ! misho     488: - The interactive shell now works with the shared readline extension.
1.1       misho     489: 
1.1.1.2 ! misho     490: - The interactive shell no longer terminates on fatal errors.
1.1       misho     491: 
1.1.1.2 ! misho     492: - A new PHP CLI command line option --rz <name> shows information about the
        !           493:   named Zend extension.
1.1       misho     494: 
1.1.1.2 ! misho     495: ===================
        !           496: 11. Windows support
        !           497: ===================
1.1       misho     498: 
1.1.1.2 ! misho     499: - is_link now works properly for symbolic links on Windows Vista
        !           500:   or later. Earlier systems do not support symbolic links.
1.1       misho     501: 
1.1.1.2 ! misho     502: ==================
        !           503: 12. New in PHP 5.4
        !           504: ==================
1.1       misho     505: 
1.1.1.2 ! misho     506: a. New Features
1.1       misho     507: 
1.1.1.2 ! misho     508:   - A built-in CLI web server for testing purposes is now available:
        !           509:      $ php -S 127.0.0.1:8888
1.1       misho     510: 
1.1.1.2 ! misho     511:   - File Upload Progress support is implemented in the Session extension.
1.1       misho     512: 
1.1.1.2 ! misho     513: b. Syntax additions
1.1       misho     514: 
1.1.1.2 ! misho     515:   - Traits:
        !           516:       trait HelloWorld {
        !           517:          public function sayHello() {
        !           518:              echo 'Hello World!';
        !           519:          }
        !           520:       }
1.1       misho     521: 
1.1.1.2 ! misho     522:       class CanIGetHello {
        !           523:          use HelloWorld;
        !           524:       }
1.1       misho     525: 
1.1.1.2 ! misho     526:       $hello = new CanIGetHello();
        !           527:       $hello->sayHello();
1.1       misho     528: 
1.1.1.2 ! misho     529:   - Function call result array access, e.g.:
        !           530:       foo()[0]
        !           531:       $foo->bar()[0]
1.1       misho     532: 
1.1.1.2 ! misho     533:   - Callable typehint indicating argument must be callable:
        !           534:       function foo(callable $do) {
        !           535:       }
        !           536:       foo("strcmp");
        !           537:       foo(function() {});
        !           538:       $o = new ArrayObject();
        !           539:       foo(array($o, "count"));
        !           540: 
        !           541:   - Short array syntax:
        !           542:       $a = [1, 2, 3, 4];
        !           543:       $a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];
        !           544:       $a = ['one' => 1, 2, 'three' => 3, 4];
        !           545: 
        !           546:   - Binary number format:
        !           547:       0b00100 0b010101
        !           548: 
        !           549:   - Chained string array offsets now work.
        !           550:       $a = "abc";
        !           551:       echo $a[0][0];
        !           552: 
        !           553:   - Anonymous functions now support using $this and class scope.
        !           554:     Anonymous function can be declared as "static" to ignore the scope.
        !           555: 
        !           556:   - Class::{expr}() syntax is now supported:
        !           557:       class A {
        !           558:          static function foo() {
        !           559:              echo "Hello world!\n";
        !           560:          }
        !           561:       }
        !           562:       $x = "f";
        !           563:       $y = "o";
        !           564:       A::{$x.$y.$y}();
        !           565: 
        !           566:   - Class member access on instantiation:
        !           567:       (new foo)->method()
        !           568:       (new foo)->property
        !           569:       (new foo)[0]
        !           570: 
        !           571: 
        !           572: c. New functions
        !           573: 
        !           574:   - Core:
        !           575:     - get_declared_traits()
        !           576:     - getimagesizefromstring()
        !           577:     - hex2bin()
        !           578:     - header_register_callback()
        !           579:     - http_response_code()
        !           580:     - stream_set_chunk_size()
        !           581:     - socket_import_stream()
        !           582:     - trait_exists()
        !           583: 
        !           584:   - Intl:
        !           585:     - transliterator_create()
        !           586:     - transliterator_create_from_rules()
        !           587:     - transliterator_create_inverse()
        !           588:     - transliterator_get_error_code()
        !           589:     - transliterator_get_error_message()
        !           590:     - transliterator_list_ids()
        !           591:     - transliterator_transliterate()
        !           592: 
        !           593:   - LDAP:
        !           594:     - ldap_control_paged_result()
        !           595:     - ldap_control_paged_result_response()
        !           596: 
        !           597:   - libxml:
        !           598:     - libxml_set_external_entity_loader()
        !           599: 
        !           600:   - mysqli:
        !           601:     - mysqli_error_list()
        !           602:     - mysqli_stmt_error_list()
        !           603: 
        !           604:   - Session:
        !           605:     - session_register_shutdown()
        !           606:     - session_status()
        !           607: 
        !           608:   - SPL
        !           609:     - class_uses()
        !           610: 
        !           611: d. New global constants
        !           612: 
        !           613:   - CURLOPT_MAX_RECV_SPEED_LARGE
        !           614:   - CURLOPT_MAX_SEND_SPEED_LARGE
        !           615:   - ENT_DISALLOWED
        !           616:   - ENT_HTML401
        !           617:   - ENT_HTML5
        !           618:   - ENT_SUBSTITUTE
        !           619:   - ENT_XHTML
        !           620:   - ENT_XML1
        !           621:   - IPPROTO_IP
        !           622:   - IPPROTO_IPV6
        !           623:   - IPV6_MULTICAST_HOPS
        !           624:   - IPV6_MULTICAST_IF
        !           625:   - IPV6_MULTICAST_LOOP
        !           626:   - IP_MULTICAST_IF
        !           627:   - IP_MULTICAST_LOOP
        !           628:   - IP_MULTICAST_TTL
        !           629:   - JSON_BIGINT_AS_STRING
        !           630:   - JSON_OBJECT_AS_ARRAY
        !           631:   - JSON_PRETTY_PRINT
        !           632:   - JSON_UNESCAPED_SLASHES
        !           633:   - JSON_UNESCAPED_UNICODE
        !           634:   - LIBXML_HTML_NODEFDTD
        !           635:   - LIBXML_HTML_NOIMPLIED
        !           636:   - LIBXML_PEDANTIC
        !           637:   - MCAST_JOIN_GROUP
        !           638:   - MCAST_LEAVE_GROUP
        !           639:   - MCAST_BLOCK_SOURCE
        !           640:   - MCAST_UNBLOCK_SOURCE
        !           641:   - MCAST_JOIN_SOURCE_GROUP
        !           642:   - MCAST_LEAVE_SOURCE_GROUP
        !           643:   - OPENSSL_CIPHER_AES_128_CBC
        !           644:   - OPENSSL_CIPHER_AES_192_CBC
        !           645:   - OPENSSL_CIPHER_AES_256_CBC
        !           646:   - OPENSSL_RAW_DATA
        !           647:   - OPENSSL_ZERO_PADDING
        !           648:   - PHP_OUTPUT_HANDLER_CLEAN
        !           649:   - PHP_OUTPUT_HANDLER_CLEANABLE
        !           650:   - PHP_OUTPUT_HANDLER_DISABLED
        !           651:   - PHP_OUTPUT_HANDLER_FINAL
        !           652:   - PHP_OUTPUT_HANDLER_FLUSH
        !           653:   - PHP_OUTPUT_HANDLER_FLUSHABLE
        !           654:   - PHP_OUTPUT_HANDLER_REMOVABLE
        !           655:   - PHP_OUTPUT_HANDLER_STARTED
        !           656:   - PHP_OUTPUT_HANDLER_STDFLAGS
        !           657:   - PHP_OUTPUT_HANDLER_WRITE
        !           658:   - PHP_QUERY_RFC1738
        !           659:   - PHP_QUERY_RFC3986
        !           660:   - PHP_SESSION_ACTIVE
        !           661:   - PHP_SESSION_DISABLED
        !           662:   - PHP_SESSION_NONE
        !           663:   - SCANDIR_SORT_ASCENDING
        !           664:   - SCANDIR_SORT_DESCENDING
        !           665:   - SCANDIR_SORT_NONE
        !           666:   - SORT_FLAG_CASE
        !           667:   - SORT_NATURAL
        !           668:   - STREAM_META_ACCESS
        !           669:   - STREAM_META_GROUP
        !           670:   - STREAM_META_GROUP_NAME
        !           671:   - STREAM_META_OWNER
        !           672:   - STREAM_META_OWNER_NAME
        !           673:   - STREAM_META_TOUCH
        !           674:   - T_CALLABLE
        !           675:   - T_INSTEADOF
        !           676:   - T_TRAIT
        !           677:   - T_TRAIT_C
        !           678:   - ZLIB_ENCODING_DEFLATE
        !           679:   - ZLIB_ENCODING_GZIP
        !           680:   - ZLIB_ENCODING_RAW
        !           681:   - U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR
        !           682:   - IDNA_CHECK_BIDI
        !           683:   - IDNA_CHECK_CONTEXTJ
        !           684:   - IDNA_NONTRANSITIONAL_TO_ASCII
        !           685:   - IDNA_NONTRANSITIONAL_TO_UNICODE
        !           686:   - INTL_IDNA_VARIANT_2003
        !           687:   - INTL_IDNA_VARIANT_UTS46
        !           688:   - IDNA_ERROR_EMPTY_LABEL
        !           689:   - IDNA_ERROR_LABEL_TOO_LONG
        !           690:   - IDNA_ERROR_DOMAIN_NAME_TOO_LONG
        !           691:   - IDNA_ERROR_LEADING_HYPHEN
        !           692:   - IDNA_ERROR_TRAILING_HYPHEN
        !           693:   - IDNA_ERROR_HYPHEN_3_4
        !           694:   - IDNA_ERROR_LEADING_COMBINING_MARK
        !           695:   - IDNA_ERROR_DISALLOWED
        !           696:   - IDNA_ERROR_PUNYCODE
        !           697:   - IDNA_ERROR_LABEL_HAS_DOT
        !           698:   - IDNA_ERROR_INVALID_ACE_LABEL
        !           699:   - IDNA_ERROR_BIDI
        !           700:   - IDNA_ERROR_CONTEXTJ
        !           701: 
        !           702: e. New classes
        !           703: 
        !           704:   - Reflection:
        !           705:     - ReflectionZendExtension
        !           706: 
        !           707:   - Intl:
        !           708:     - Transliterator
        !           709:     - Spoofchecker
        !           710: 
        !           711:   - JSON:
        !           712:     - JsonSerializable
        !           713: 
        !           714:   - Session:
        !           715:     - SessionHandler
        !           716: 
        !           717:   - SNMP:
        !           718:     - SNMP
        !           719: 
        !           720:   - SPL:
        !           721:     - CallbackFilterIterator
        !           722:     - RecursiveCallbackFilterIterator
        !           723: 
        !           724: f. New methods
        !           725: 
        !           726:   - Closure:
        !           727:     - Closure::bind()
        !           728:     - Closure::bindTo()
        !           729: 
        !           730:   - Reflection:
        !           731:     - ReflectionClass::getTraitAliases()
        !           732:     - ReflectionClass::getTraitNames()
        !           733:     - ReflectionClass::getTraits()
        !           734:     - ReflectionClass::isCloneable()
        !           735:     - ReflectionClass::isTrait()
        !           736:     - ReflectionClass::newInstanceWithoutConstructor()
        !           737:     - ReflectionExtension::isPersistent()
        !           738:     - ReflectionExtension::isTemporary()
        !           739:     - ReflectionFunction::getClosure()
        !           740:     - ReflectionFunction::getClosureScopeClass()
        !           741:     - ReflectionFunction::getClosureThis()
        !           742:     - ReflectionFunctionAbstract::getClosureScopeClass()
        !           743:     - ReflectionFunctionAbstract::getClosureThis()
        !           744:     - ReflectionMethod::getClosure()
        !           745:     - ReflectionMethod::getClosureScopeClass()
        !           746:     - ReflectionMethod::getClosureThis()
        !           747:     - ReflectionObject::getTraitAliases()
        !           748:     - ReflectionObject::getTraitNames()
        !           749:     - ReflectionObject::getTraits()
        !           750:     - ReflectionObject::isCloneable()
        !           751:     - ReflectionObject::isTrait()
        !           752:     - ReflectionObject::newInstanceWithoutConstructor()
        !           753:     - ReflectionParameter::canBePassedByValue()
        !           754:     - ReflectionParameter::isCallable()
        !           755: 
        !           756:   - PDO_DBLIB:
        !           757:     - PDO::newRowset()
        !           758: 
        !           759:   - SPL:
        !           760:     - DirectoryIterator::getExtension()
        !           761:     - RegexIterator::getRegex()
        !           762:     - SplDoublyLinkedList::serialize()
        !           763:     - SplDoublyLinkedList::unserialize()
        !           764:     - SplFileInfo::getExtension()
        !           765:     - SplFileObject::fputcsv()
        !           766:     - SplObjectStorage::getHash()
        !           767:     - SplQueue::serialize
        !           768:     - SplQueue::unserialize
        !           769:     - SplStack::serialize
        !           770:     - SplStack::unserialize
        !           771:     - SplTempFileObject::fputcsv
        !           772: 
        !           773:   - XSLT:
        !           774:     - XsltProcessor::setSecurityPrefs()
        !           775:     - XsltProcessor::getSecurityPrefs()
        !           776: 
        !           777:   - Zlib:
        !           778:     - zlib_decode()
        !           779:     - zlib_encode()
        !           780: 
        !           781: g. New Hash algorithms
        !           782: 
        !           783:   - fnv132
        !           784:   - fnv164
        !           785:   - joaat

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>