summaryrefslogtreecommitdiff
path: root/UPGRADING
blob: f38e640b92f68e3628772abbadc560b9175e1603 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
$Id$

PHP 5.4 UPGRADE NOTES

===========
0. Contents
===========

1. Changes to INI directives
2. Changes to reserved words and classes
3. Changes to engine behavior
4. Changes to existing functions
   a. unserialize() change
5. Changes to existing classes
6. Changes to existing methods
7. Deprecated Functionality
8. Removed Functionality
     a. Removed features
     b. Removed functions
     c. Removed syntax
     d. Removed hash algorithms
9. Extension Changes:
     a. Extensions no longer maintained
     b. Extensions with changed behavior
10. Changes in SAPI support
11. Windows support
12. New in PHP 5.4:
     a. New features
     b. Syntax additions
     c. New functions
     d. New global constants
     e. New classes
     f. New methods
     g. New hash algorithms

=============================
1. Changes to INI directives
=============================

- PHP 5.4 now checks at compile time if /dev/urandom or /dev/arandom
  are present. If either is available, session.entropy_file now
  defaults to that file and session.entropy_length defaults to 32.
  This provides non-blocking entropy to session id generation. If you
  do not want extra entropy for your session ids, add:

    session.entropy_file=
    session.entropy_length=0

  to your php.ini to preserve pre-PHP 5.4 behavior.

- Deprecated php.ini directives will now throw an E_CORE_WARNING's
  instead of the previous E_WARNING's.

- The following php.ini directives are no longer available in PHP 5.4
  and will now throw an E_CORE_ERROR upon startup:
  - allow_call_time_pass_reference
  - define_syslog_variables
  - highlight.bg
  - magic_quotes_gpc
  - magic_quotes_runtime
  - magic_quotes_sybase
  - register_globals
  - register_long_arrays
  - safe_mode
  - safe_mode_gid
  - safe_mode_include_dir
  - safe_mode_exec_dir
  - safe_mode_allowed_env_vars
  - safe_mode_protected_env_vars
  - session.bug_compat_42
  - session.bug_compat_warn
  - y2k_compliance
  - zend.ze1_compatibility_mode

- the following new php.ini directives were added:
  - max_input_vars - specifies how many GET/POST/COOKIE input
    variables may be accepted. The default value is 1000.

- E_ALL now includes E_STRICT.

- The recommended production value for error_reporting changed to E_ALL &
  ~E_DEPRECATED & ~E_STRICT.

- Added new session support directives:
    session.upload_progress.enabled
    session.upload_progress.cleanup
    session.upload_progress.prefix
    session.upload_progress.name
    session.upload_progress.freq
    session.upload_progress.min_freq

- Added a zend.multibyte directive as a replacement of the PHP compile time
  configuration option --enable-zend-multibyte. Now the Zend Engine always
  contains code for multibyte support, which can be enabled or disabled at
  runtime. Note: It doesn't make a lot of sense to enable this option if
  ext/mbstring is not enabled, because most functionality is implemented by
  mbstrings callbacks.

- Added zend.script_encoding. This value will be used unless a
  "declare(encoding=...)" directive appears at the top of the script.

- Added zend.signal_check to check for replaced signal handlers on shutdown

- Added enable_post_data_reading, which is enabled by default. When it's
  disabled, the POST data is not read (or processed); the behavior is similar
  to that of other request methods with body, like PUT. This allows reading
  the raw POST data in multipart requests and reading/processing the POST data
  in a stream fashion (through php://input) without having it copied in memory
  multiple times.

- Added windows_show_crt_warning. This directive shows the CRT warnings when
  enabled. These warnings were displayed by default until now. It is disabled
  by default.

- Added cli.pager to set a pager for CLI interactive shell output.

- Added cli.prompt to configure the CLI interactive shell prompt.

- Added cli_server.color to enable the CLI web server to use ANSI color coding
  in terminal output.

========================================
2. Changes to reserved words and classes
========================================

- "callable", "insteadof" and "trait" are now reserved words.

=============================
3. Changes to engine behavior
=============================

- The __construct arguments of an extended abstract constructor must
  now match:

  abstract class Base
  {
    abstract public function __construct();
  }
  class Foo extends Base
  {
    public function __construct($bar) {}
  }

  This now emits a Fatal error due the incompatible declaration.

- In previous versions, superglobal names could be used for parameter
  names, thereby shadowing the corresponding superglobal. In PHP 5.4
  this now causes a fatal error such as "Cannot re-assign auto-global
  variable GLOBALS".

- Turning null, false or an empty string into an object by adding a
  property will now emit a warning instead of an E_STRICT error.

  $test = null;
  $test->baz = 1;

  To create a generic object you can use StdClass:

  $test = new StdClass;
  $test->baz = 1;

- Converting an array to a string now will cause an E_NOTICE warning.

- Non-numeric string offsets, e.g. $a['foo'] where $a is a string, now
  return false on isset() and true on empty(), and produce warning if
  trying to use them. Offsets of types double, bool and null produce
  notice. Numeric strings ($a['2']) still work as before.

  Note that offsets like '12.3' and '5 and a half' are considered
  non-numeric and produce warning, but are converted to 12 and 5
  respectively for backwards compatibility reasons.

- Long numeric strings that do not fit in integer or double (such as
  "92233720368547758070") are compared using string comparison if 
  they could otherwise result in precision loss - since 5.4.4.

- Closures now support scopes and $this and can be rebound to
  objects using Closure::bind() and Closure::bindTo().

- <?= is now always available regardless of the short_open_tag
  setting.

- Parse error messages are changed to contain more information about
  the error.

- __clone and __destruct since 5.4.4 follow the same scoping rules as 
  the rest of the methods (see bug #61782 for details).

================================
4. Changes to existing functions
================================

- array_combine now returns array() instead of FALSE when two empty arrays are
  provided as parameters.

- dns_get_record() has an extra parameter which allows requesting DNS records
  by numeric type and makes the result include only the raw data of the
  response.

- call_user_func_array() no longer allows call-time pass by reference.

- the default character set for htmlspecialchars() and htmlentities() is
  now UTF-8. In previous versions it was ISO-8859-1. Note that changing
  your output charset via the php.ini default_charset directive does not
  affect htmlspecialchars/htmlentities unless you are passing "" (an 
  empty string) as the encoding parameter to your htmlspecialchars/htmlentities
  calls. 

- htmlentities() and htmlspecialchars() are stricter in the code units they
  accept for the asian encodings. For Big5-HKSCS, the octets 0x80 and 0xFF are
  rejected. For GB2312/EUC-CN, the octets 0x8E, 0x8F, 0xA0 and 0xFF are
  rejected. For SJIS, the octets 0x80, 0xA0, 0xFD, 0xFE and 0xFF are rejected,
  except maybe after a valid starting byte. For EUC-JP, the octets 0xA0 and
  0xFF are rejected.

- htmlentities() now emits an E_STRICT warning when used with asian characters,
  as in that case htmlentities has (and already had before this version) the
  same functionality as htmlspecialchars.

- htmlentities() no longer numerically encodes high characters for single-byte
  encodings (except when there's actually a corresponding named entity). This
  behavior was not documented and was inconsistent with that for "UTF-8".

- html_entity_decode() and htmlspecialchars_decode() behave more consistently,
  now decoding entities in malformed strings such as "&&amp;" or "&#&amp;".

- htmlentities(), htmlspecialchars(), html_entity_decode(), and
  htmlspecialchars_decode: Added the flags ENT_HTML401, ENT_XML1, ENT_XHTML,
  and ENT_HTML5. The behavior of these functions including, but not limited to,
  the characters that are encoded and the entities that are decoded depend on
  the document type that is specified by those flags.

- htmlentities() and htmlspecialchars() with !$double_encode do more strict
  checks on the validity of the entities. Numerical entities are checked for a
  valid range (0 to 0x10FFFF); if the flag ENT_DISALLOWED is given, the
  validity of such numerical entity in the target document type is also
  checked. Named entities are checked for necessary existence in the target
  document type instead of only checking whether they were constituted by
  alphanumeric characters.

- The flag ENT_DISALLOWED was added. In addition to the behavior described in
  the item before, it also makes htmlentities() and htmlspecialchars()
  substitute characters that appear literally in the argument string and which
  are not allowed in the target document type with U+FFFD (UTF-8) or &#xFFFD;.

- The flag ENT_SUBSTITUTE was added. This flag makes invalid multibyte
  sequences be replaced by U+FFFD (UTF-8) or &#FFFD; by htmlspecialchars() and
  htmlentities(). It is an alternative to the default behavior, which just
  returns an empty string and to ENT_IGNORE, which is a security risk. The
  behavior follows the recommendations of Unicode Technical Report #36.

- htmlspecialchars_decode() and html_entity_decode() now decode &apos; if the
  document type is ENT_XML1, ENT_XHTML, or ENT_HTML5.

- Charset detection with $charset == '' no longer turns to mbstring's
  internal encoding defined through mb_internal_encoding(). Only the encoding
  defined through the php.ini setting mbstring.internal_encoding is considered.

- number_format() no longer truncates multibyte decimal points and thousand
  separators to the first byte.

- The third parameter ($matches) to preg_match_all() is now optional. If
  omitted, the function will simply return the number of times the pattern was
  matched in the subject and will have no other side effects.

- The second argument of scandir() now accepts SCANDIR_SORT_NONE (2) as a
  possible value. This value results in scandir() performing no sorting: on
  local filesystems, this allows files to be returned in native filesystem
  order.

- stream_select() now preserves the keys of the passed array, be they numeric or
  strings. This breaks code that iterated the resulting stream array using a
  numeric index, but makes easier to identify which of the passed streams are
  present in the result.

- stream_set_write_buffer() no longer disables the read buffer of a plain
  stream when 0 is given as the second argument.

- stream_set_write_buffer() no longer changes the chunk size in socket streams.

- fclose() closes streams with resource refcount > 1; it doesn't merely
  decrement the resource refcount.

- socket_set_options() and socket_get_options() now support multicast options.

- The raw data parameter in openssl_encrypt() and openssl_decrypt() is now an
  options integer rather than a boolean. A value of true produces the same
  behavior.

- Write operations within XSLT (for example with the extension sax:output) are
  disabled by default. You can define what is forbidden with the method
  XsltProcess::setSecurityPrefs($options).

- Added AES support to OpenSSL.

- openssl_csr_new() expects the textual data to be in UTF-8.

- Added no-padding option to openssl_encrypt() and openssl_decrypt().

- Added a "no_ticket" SSL context option to disable the SessionTicket TLS
  extension.

- Added new json_encode() options: JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES,
  JSON_NUMERIC_CHECK, JSON_BIGINT_AS_STRING, JSON_UNESCAPED_UNICODE.

- Added Tokyo Cabinet and Berkley DB 5 support to DBA extension.

- Added support for CURLOPT_MAX_SEND_SPEED_LARGE and CURLOPT_MAX_RECV_SPEED_LARGE
  to cURL.

- Added optional argument to debug_backtrace() and debug_print_backtrace()
  to limit the amount of stack frames returned.

- Fixed crypt_blowfish handling of 8-bit characters. crypt() in Blowfish mode
  now supports hashes marked $2a$, $2x$ and $2y$.

- mbstring now supports following encodings: Shift_JIS/UTF-8 Emoji,
  JIS X0213:2004 (Shift_JIS-2004, EUC-JP-2004, ISO-2022-JP-2004),
  MacJapanese (Shift_JIS), gb18030.

- Added encode and decode in hex format to mb_encode_numericentity() and
  mb_decode_numericentity().

- Added support for SORT_NATURAL and SORT_FLAG_CASE in array sort functions:
  sort(), rsort(), ksort(), krsort(), asort(), arsort() and array_multisort().

- is_a() and is_subclass_of() now have third boolean parameter, which specifies
  if the first argument can be a string class name. Default if false for is_a
  and true for is_subclass_of() for BC reasons.

- ob_start() will now treat a chunk size of 1 as meaning 1 byte, rather than
  the previous special case behavior of treating it as 4096 bytes.

- idn_to_ascii() and idn_to_utf8() now take two extra parameters, one indicating
  the variant (IDNA 2003 or UTS #46) and another, passed by reference, to return
  details about the operation in case UTS #46 is chosen.

- gzencode() used with FORCE_DEFLATE now generates RFC1950 compliant data.

- ob_start() no longer starts multiple output buffers when passed
  array("callback1", "callback2", "callback3", ...).

- Since 5.4.4, "php://fd" stream syntax is available only in CLI build.

- Since 5.4.5, resourcebundle_create() accepts null for the first two arguments.

- Since 5.4.6, SimpleXMLElement::getDocNamespaces() has and extra parameter which
  allows for toggling if the list of namespaces starts from the document root
  or from the node you call the method on

- Since 5.4.7, ctor is always called when new user stream wrapper object is created.
  Before, it was called only when stream_open was called.

4a. unserialize() change
------------------------

- Starting PHP 5.4.29, the bug fix for bug #67072 introduces a change to 
  unserialize() function, detailed below:

    If the string looking like 'O:..:"ClassName":...' is unserialized, and
    the class named is an internal class that declares custom unserializer
    function, or extends such class, unserialize would fail.

    Using O: for user classes not extending internal classes (including
    those implementing Serializable) is still supported in 5.4, though
    it is deprecated and may not be supported in 5.6 for classes that do not 
    originally serialize to O:. Same for using O: for internal classes 
    implementing Serializable (like ArrayObject) and classes that extend 
    them.

    The reason for that is that O: format is meant to be used with classes
    that do not define custom handlers, and was never intended for the use
    with classes that do. When used with the class that relies on custom
    unserializer, it can leave the object of such internal class in an
    inconsistent state which has been observed to result in crashes and may
    also lead to memory corruption and ultimately even arbitrary code
    execution. This was never the intended use of unserializer, and mere
    possibility of doing this constitutes a bug, since the data passed to
    unserialize() is not a valid serialization of any object. Since there
    are many applications applying unserialize() to untrusted data, this
    presents a potential security vulnerability. Thus, keeping such bug in
    the code base was considered too dangerous.

    We are aware that some applications use O: format as a way to
    instantiate classes. This was never the intended usage of serializer,
    and ReflectionClass methods such as newInstance or
    newInstanceWithoutConstructor can be used for that. We're working on
    providing more comprehensive solution for such use cases in PHP 5.6 and
    welcome the ideas in this area.

    We note also that using unserialize() on any data that is not the result
    of serialize() call continues to be an unsupported scenario and should
    not be relied on to produce any specific result.

==============================
5. Changes to existing classes
==============================

- Classes that implement stream wrappers can define a method called
  stream_truncate that will respond to truncation, e.g. through ftruncate.
  Strictly speaking, this is an addition to the user-space stream wrapper
  template, not a change to an actual class.

- Classes that implement stream wrappers can define a method called
  stream_metadata that will be called on touch(), chmod(), chgrp(), chown().

- Arrays cast from SimpleXMLElement now always contain all nodes instead of
  just the first matching node.

- All SimpleXMLElement children are now always printed when using var_dump(),
  var_export(), and print_r().

- Added iterator support in MySQLi. mysqli_result implements Traversable.

- Since 5.4.30, SOAPClient has __getCookies() method. 

==============================
6. Changes to existing methods
==============================

- DateTime::parseFromFormat() now has a "+" modifier to allow trailing text in
  the string to parse without throwing an error.

- Added the ability to pass options to DOMDocument::loadHTML().

- FilesystemIterator, GlobIterator and (Recursive)DirectoryIterator now use
  the default stream context.

- Since 5.4.5, the constructor of ResourceBundle accepts NULL for the first two
  arguments.

===========================
7. Deprecated Functionality
===========================

- The following functions are deprecated in PHP 5.4:
  - mcrypt_generic_end():       use mcrypt_generic_deinit() instead
  - mysql_list_dbs()

========================
8. Removed Functionality
========================

a. Removed features

   The following features have been removed from PHP 5.4:

   - Magic quotes
   - Register globals
   - Safe mode
   - Session extension bug compatibility mode
   - Y2K compliance mode

b. Removed functions

   The following functions are no longer available in PHP 5.4:

   - define_syslog_variables()
   - import_request_variables()
   - session_is_registered()
   - session_register()
   - session_unregister()
   - set_magic_quotes_runtime()
   - mysqli_bind_param() (alias of mysqli_stmt_bind_param())
   - mysqli_bind_result() (alias of mysqli_stmt_bind_result())
   - mysqli_client_encoding() (alias of mysqli_character_set_name())
   - mysqli_fetch() (alias of mysqli_stmt_fetch())
   - mysqli_param_count() (alias of mysqli_stmt_param_count())
   - mysqli_get_metadata() (alias of mysqli_stmt_result_metadata())
   - mysqli_send_long_data() (alias of mysqli_stmt_send_long_data())
   - mysqli::client_encoding() (alias of mysqli::character_set_name)
   - mysqli_stmt::stmt() (never worked/always throws, undocumented)

c. Removed syntax

   - break $var;
   - continue $var;

d. Removed hash algorithms

   - Salsa10 and Salsa20, which are actually stream ciphers

====================
9. Extension Changes
====================

a. Extensions no longer maintained

   - ext/sqlite is no longer part of the base distribution and has been moved
     to PECL. Use sqlite3 or PDO_SQLITE instead.

b. Extensions with changed behavior

   - The MySQL extensions (ext/mysql, mysqli and PDO_MYSQL) use mysqlnd
     as the default library now. It is still possible to use libmysql by
     specifying a path to the configure options.

   - PDO_MYSQL: Support for linking with MySQL client libraries older
     than 4.1 is removed.

   - The session extension now can hook into the file upload feature
     in order to provide upload progress information through session
     variables.

   - SNMP extension
     - Functions in SNMP extension now returns FALSE on every error
       condition including SNMP-related (no such instance, end of MIB,
       etc). Thus, in patricular, breaks previous behavior of get/walk
       functions returning an empty string on SNMP-related errors.
     - Multi OID get/getnext/set queries are now supported.
     - New constants added for use in snmp_set_oid_output_format()
       function.
     - Function snmp_set_valueretrieval() changed it's behavior:
	    SNMP_VALUE_OBJECT can be combined with one of
	    SNMP_VALUE_PLAIN or SNMP_VALUE_LIBRARY resulting OID value
	    changes. When no SNMP_VALUE_PLAIN or SNMP_VALUE_LIBRARY
	    is supplied with SNMP_VALUE_OBJECT, SNMP_VALUE_LIBRARY is used.
	    Prior to 5.4.0 when no SNMP_VALUE_PLAIN or SNMP_VALUE_LIBRARY
	    was supplied with SNMP_VALUE_OBJECT, SNMP_VALUE_PLAIN was used.
     - Added feature-rich OO API (SNMP class)
     - Dropped UCD-SNMP compatibility code. Consider upgrading to
       net-snmp v5.3+. Net-SNMP v5.4+ is required for Windows version.
     - In sake of adding support for IPv6 DNS name resolution of
       remote SNMP agent (peer) is done by extension now, not by Net-SNMP
       library anymore.

   - Date extension
     - Setting the timezone with the TZ environment variable is no longer
       supported, instead date.timezone and/or date_default_timezone_set()
       have to be used.
     - The extension will no longer guess the default timezone if none
       is set with date.timezone and/or date_default_timezone_set().
       Instead it will always fall back to "UTC".

   - Hash extension
     - the output of the tiger hash family has been corrected, see
       https://bugs.php.net/61307

===========================
10. Changes in SAPI support
===========================

- A REQUEST_TIME_FLOAT value returns a floating point number indicating the
  time with microsecond precision. All SAPIs providing this value should be
  returning float and not time_t.

- apache_child_terminate(), getallheaders(), apache_request_headers()
  and apache_response_headers() are now supported on FastCGI.

- The interactive shell allows a shortcut #inisetting=value to change php.ini
  settings at run-time.

- The interactive shell now works with the shared readline extension.

- The interactive shell no longer terminates on fatal errors.

- A new PHP CLI command line option --rz <name> shows information about the
  named Zend extension.

===================
11. Windows support
===================

- is_link now works properly for symbolic links on Windows Vista
  or later. Earlier systems do not support symbolic links.

- As of PHP 5.4.5 and above the COM extension isn't compiled statically in PHP
  anymore but shared. It'll still be delivered with the standard PHP release but
  must be activated manually with the "extension = php_com_dotnet.dll" directive
  in php.ini.

- Apache 2.4 handler is supported as of PHP 5.4.9

==================
12. New in PHP 5.4
==================

a. New Features

  - A built-in CLI web server for testing purposes is now available:
     $ php -S 127.0.0.1:8888

  - File Upload Progress support is implemented in the Session extension.

b. Syntax additions

  - Traits:
      trait HelloWorld {
	  public function sayHello() {
	      echo 'Hello World!';
	  }
      }

      class CanIGetHello {
	  use HelloWorld;
      }

      $hello = new CanIGetHello();
      $hello->sayHello();

  - Function call result array access, e.g.:
      foo()[0]
      $foo->bar()[0]

  - Callable typehint indicating argument must be callable:
      function foo(callable $do) {
      }
      foo("strcmp");
      foo(function() {});
      $o = new ArrayObject();
      foo(array($o, "count"));

  - Short array syntax:
      $a = [1, 2, 3, 4];
      $a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];
      $a = ['one' => 1, 2, 'three' => 3, 4];

  - Binary number format:
      0b00100 0b010101

  - Chained string array offsets now work.
      $a = "abc";
      echo $a[0][0];

  - Anonymous functions now support using $this and class scope.
    Anonymous function can be declared as "static" to ignore the scope.

  - Class::{expr}() syntax is now supported:
      class A {
	  static function foo() {
	      echo "Hello world!\n";
	  }
      }
      $x = "f";
      $y = "o";
      A::{$x.$y.$y}();

  - Class member access on instantiation:
      (new foo)->method()
      (new foo)->property
      (new foo)[0]


c. New functions

  - Core:
    - get_declared_traits()
    - getimagesizefromstring()
    - hex2bin()
    - header_register_callback()
    - http_response_code()
    - stream_set_chunk_size()
    - socket_import_stream()
    - trait_exists()

  - Intl:
    - transliterator_create()
    - transliterator_create_from_rules()
    - transliterator_create_inverse()
    - transliterator_get_error_code()
    - transliterator_get_error_message()
    - transliterator_list_ids()
    - transliterator_transliterate()

  - LDAP:
    - ldap_control_paged_result()
    - ldap_control_paged_result_response()
    - ldap_modify_batch (5.4.26)

  - libxml:
    - libxml_set_external_entity_loader()

  - mysqli:
    - mysqli_error_list()
    - mysqli_stmt_error_list()

  - pgsql
    - pg_escape_identifier() (5.4.4)
    - pg_escape_literal() (5.4.4)

  - Session:
    - session_register_shutdown()
    - session_status()

  - SPL
    - class_uses()

  - SplFixedArray
    - SplFixedArray::__wakeup() (5.4.18)

d. New global constants

  - CURLOPT_MAX_RECV_SPEED_LARGE
  - CURLOPT_MAX_SEND_SPEED_LARGE
  - ENT_DISALLOWED
  - ENT_HTML401
  - ENT_HTML5
  - ENT_SUBSTITUTE
  - ENT_XHTML
  - ENT_XML1
  - IPPROTO_IP
  - IPPROTO_IPV6
  - IPV6_MULTICAST_HOPS
  - IPV6_MULTICAST_IF
  - IPV6_MULTICAST_LOOP
  - IP_MULTICAST_IF
  - IP_MULTICAST_LOOP
  - IP_MULTICAST_TTL
  - JSON_BIGINT_AS_STRING
  - JSON_OBJECT_AS_ARRAY
  - JSON_PRETTY_PRINT
  - JSON_UNESCAPED_SLASHES
  - JSON_UNESCAPED_UNICODE
  - LIBXML_HTML_NODEFDTD
  - LIBXML_HTML_NOIMPLIED
  - LIBXML_PEDANTIC
  - MCAST_JOIN_GROUP
  - MCAST_LEAVE_GROUP
  - MCAST_BLOCK_SOURCE
  - MCAST_UNBLOCK_SOURCE
  - MCAST_JOIN_SOURCE_GROUP
  - MCAST_LEAVE_SOURCE_GROUP
  - OPENSSL_CIPHER_AES_128_CBC
  - OPENSSL_CIPHER_AES_192_CBC
  - OPENSSL_CIPHER_AES_256_CBC
  - OPENSSL_RAW_DATA
  - OPENSSL_ZERO_PADDING
  - PHP_OUTPUT_HANDLER_CLEAN
  - PHP_OUTPUT_HANDLER_CLEANABLE
  - PHP_OUTPUT_HANDLER_DISABLED
  - PHP_OUTPUT_HANDLER_FINAL
  - PHP_OUTPUT_HANDLER_FLUSH
  - PHP_OUTPUT_HANDLER_FLUSHABLE
  - PHP_OUTPUT_HANDLER_REMOVABLE
  - PHP_OUTPUT_HANDLER_STARTED
  - PHP_OUTPUT_HANDLER_STDFLAGS
  - PHP_OUTPUT_HANDLER_WRITE
  - PHP_QUERY_RFC1738
  - PHP_QUERY_RFC3986
  - PHP_SESSION_ACTIVE
  - PHP_SESSION_DISABLED
  - PHP_SESSION_NONE
  - SCANDIR_SORT_ASCENDING
  - SCANDIR_SORT_DESCENDING
  - SCANDIR_SORT_NONE
  - SORT_FLAG_CASE
  - SORT_NATURAL
  - STREAM_META_ACCESS
  - STREAM_META_GROUP
  - STREAM_META_GROUP_NAME
  - STREAM_META_OWNER
  - STREAM_META_OWNER_NAME
  - STREAM_META_TOUCH
  - T_CALLABLE
  - T_INSTEADOF
  - T_TRAIT
  - T_TRAIT_C
  - ZLIB_ENCODING_DEFLATE
  - ZLIB_ENCODING_GZIP
  - ZLIB_ENCODING_RAW
  - U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR
  - IDNA_CHECK_BIDI
  - IDNA_CHECK_CONTEXTJ
  - IDNA_NONTRANSITIONAL_TO_ASCII
  - IDNA_NONTRANSITIONAL_TO_UNICODE
  - INTL_IDNA_VARIANT_2003
  - INTL_IDNA_VARIANT_UTS46
  - IDNA_ERROR_EMPTY_LABEL
  - IDNA_ERROR_LABEL_TOO_LONG
  - IDNA_ERROR_DOMAIN_NAME_TOO_LONG
  - IDNA_ERROR_LEADING_HYPHEN
  - IDNA_ERROR_TRAILING_HYPHEN
  - IDNA_ERROR_HYPHEN_3_4
  - IDNA_ERROR_LEADING_COMBINING_MARK
  - IDNA_ERROR_DISALLOWED
  - IDNA_ERROR_PUNYCODE
  - IDNA_ERROR_LABEL_HAS_DOT
  - IDNA_ERROR_INVALID_ACE_LABEL
  - IDNA_ERROR_BIDI
  - IDNA_ERROR_CONTEXTJ

e. New classes

  - Reflection:
    - ReflectionZendExtension

  - Intl:
    - Transliterator
    - Spoofchecker

  - JSON:
    - JsonSerializable

  - Session:
    - SessionHandler

  - SNMP:
    - SNMP

  - SPL:
    - CallbackFilterIterator
    - RecursiveCallbackFilterIterator

f. New methods

  - Closure:
    - Closure::bind()
    - Closure::bindTo()

  - Reflection:
    - ReflectionClass::getTraitAliases()
    - ReflectionClass::getTraitNames()
    - ReflectionClass::getTraits()
    - ReflectionClass::isCloneable()
    - ReflectionClass::isTrait()
    - ReflectionClass::newInstanceWithoutConstructor()
    - ReflectionExtension::isPersistent()
    - ReflectionExtension::isTemporary()
    - ReflectionFunction::getClosure()
    - ReflectionFunction::getClosureScopeClass()
    - ReflectionFunction::getClosureThis()
    - ReflectionFunctionAbstract::getClosureScopeClass()
    - ReflectionFunctionAbstract::getClosureThis()
    - ReflectionMethod::getClosure()
    - ReflectionMethod::getClosureScopeClass()
    - ReflectionMethod::getClosureThis()
    - ReflectionObject::getTraitAliases()
    - ReflectionObject::getTraitNames()
    - ReflectionObject::getTraits()
    - ReflectionObject::isCloneable()
    - ReflectionObject::isTrait()
    - ReflectionObject::newInstanceWithoutConstructor()
    - ReflectionParameter::canBePassedByValue()
    - ReflectionParameter::isCallable()

  - PDO_DBLIB:
    - PDO::newRowset()

  - SPL:
    - DirectoryIterator::getExtension()
    - RegexIterator::getRegex()
    - SplDoublyLinkedList::serialize()
    - SplDoublyLinkedList::unserialize()
    - SplFileInfo::getExtension()
    - SplFileObject::fputcsv()
    - SplObjectStorage::getHash()
    - SplQueue::serialize
    - SplQueue::unserialize
    - SplStack::serialize
    - SplStack::unserialize
    - SplTempFileObject::fputcsv

  - XSLT:
    - XsltProcessor::setSecurityPrefs()
    - XsltProcessor::getSecurityPrefs()

  - Zlib:
    - zlib_decode()
    - zlib_encode()

g. New Hash algorithms

  - fnv132
  - fnv164
  - joaat