Újítások PHP 5.2-ről 5.3-ra
Névterek
Névterek támogatása lett hozzáadva a nyelvhez. A névterek két fő probléma
megoldására hivatottak, a név ütközések feloldására és a aliasolás lehetőségnek
megteremtésére.
Részletes leírás itt található
Late Static Bindings
A Late Static Bindings a statikus metódus hívásoknál kap szerepet. A self és
a __CLASS__ arra az osztályra mutat, ahol deklarálva lett. Az static kulcsszó
viszont a hívott osztályra mutat. Példával illusztrálva:
class A {
public static function who() {
echo __CLASS__;
} public static function test() {
self::who();
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test();
A
class A {
public static function who() {
echo __CLASS__;
} public static function test() {
static::who(); // Here comes Late Static Bindings
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test();
B
Részletes leírás itt található
Goto
A jól ismert goto utasítást is beemelték a nyelvbe. A goto utasítás arra
használható, hogy a program egyik részéből a másikba ugorjunk. A célpontnak
azonos fájlban kell lennie.
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
if($j==17) goto end;
}
} echo "i = $i"; end: echo 'j hit 17';
j hit 17
_callStatic() metódus
A __callStatic() mágikus metódust egy osztályon belül lehet definiálni.
Automatikusan hívódik meg akkor, amikor olyan statikus metódust akarunk
meghívni, ami nincs deklarálva. Overloadingot lehet vele megvalósítani.
class MethodTest {
public function __call($name, $arguments) {
// Note: value of $name is case sensitive.
echo "Calling object method '$name' "
. implode(', ', $arguments). "\n";
}
/** As of PHP 5.3.0 */
public static function __callStatic($name, $arguments) {
// Note: value of $name is case sensitive.
echo "Calling static method '$name' "
. implode(', ', $arguments). "\n";
}
}
$obj = new MethodTest; $obj->runTest('in object context');
MethodTest::runTest('in static context'); // As of PHP 5.3.0
Calling object method 'runTest' in object context
Calling static method 'runTest' in static context
__invoke() metódus
Az __invoke() mágikus metódust osztályon belül lehet definiálni.
Automatikusan hívódik meg akkor, ha egy objektumot függvényként próbálunk
meghívni.
class CallableClass {
public function __invoke($x) {
var_dump($x);
}
} $obj = new CallableClass; $obj(5); var_dump(is_callable($obj));
int(5) bool(true)
Újítások PHP 5.3-ről 5.4-re
Traitek
Bekerült a PHP-ba a traitek támogatása. A traitek alapvetően kód
újrahasznosítást tesznek lehetővé. Az egyszeres öröklődés korlátainak
csökkentésére szolgál
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ } function getReturnDescription() { /*2*/ }
}
class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}
class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
Részletes leírás itt található
Rövid tömb szintaxis
Tömböket már rövidített formában is létre lehet hozni. Az alábbi példa jól
szemlélteti ezt
$a = [1, 2, 3, 4]; $a = ['one' => 1, 'two' => 2, 'three' =>
3, 'four' => 4];
Closure és a $this
A closureök alkalmazása során már
lehetőség van a $this kulcsszó használatára, amely ilyenkor a megszokott módon
működik.
Objektum elérés inicializáláskor
Lehetőség van inicializálás után egyből használni az objektumot. Ezt eddig
csak két lépésben tudtuk megtenni.
$foo = new Foo(); $foo->bar();
(new Foo)->bar();
Újítások PHP 5.4-ről 5.5-re
Generátorok
Generátorok támogatása a yield kulcsszóval. A generátorok egyszerű módot
adnak egyszerű iterátorok implementálására az overhead nélkül amit egy osztály
implementálása adna, ami rendelkezik az Iterator interfésszel
function xrange($start, $limit, $step = 1) {
for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
}
echo 'Single digit odd numbers: ';
/*
* Note that an array is never created or returned,
* which saves memory. */
foreach (xrange(1, 9, 2) as $number) {
echo "$number ";
}
echo "\n";
Single digit odd numbers: 1 3 5 7 9
Részletes leírás itt található
Finally kulcsszó
A try-catch blokk már támogatja a finally blokkot is. Az ebben a blokkban
található kód, le fog futni, függetlenül attól, hogy volt-e expection vagy
sem.
Új jelszó hashelő API
Új jelszó hashelő API került bevezetésre, ami könnyebbé teszi, hogy
biztonságosan hash-eljünk és menedzseljünk jelszavakat. Ez egy erős egy-irányú
hash algoritmust implementál. Kompatibilis a crypt() függvénnyel. A függvény:
password_hash()
A foreach támogatja a list()-et
A foreach szerkezet támogatja a beágyazott tömbök kicsomagolását külön
változókba a list() segítségével
$array = [
[1, 2], [3, 4],
];
foreach ($array as list($a, $b)) {
echo "A: $a; B: $b\n";
}
A: 1; B: 2 A: 3; B: 4
empty() függvény kifejezéseket is támogat
Az empty() függvény már nem csak változókat, hanem kifejezéseket is támogat
paraméterként.
function always_false() {
return false;
}
if (empty(always_false())) {
echo "This will be printed.\n";
}
if (empty(true)) {
echo "This will not be printed.\n";
}
This will be printed.
Tömb és sztring dereferenciálás
Tömböket és sztringeket közvetlenül lehet dereferenciálni és az egyes elemeit
elérni
echo 'Array dereferencing: '; echo [1, 2, 3][0]; echo "\n";
echo 'String dereferencing: '; echo 'PHP'[0]; echo "\n";
Array dereferencing: 1 String dereferencing: P
Osztály név feloldás
Lehetőség van a ClassName::class használatára a "fully qualified name of
class" eléréséhez.
namespace Name\Space; class ClassName {}
echo ClassName::class;
echo "\n";
Name\Space\ClassName
foreach nem skalár kulcsok
A foreach támogatja a nem skalár kulcsokat. Az Iterator::key() bármilyen
típust visszaadhat, ami egy PHP tömb kulcsaként szerepelhet.
Újítások PHP 5.5-ről 5.6-re
Konstant skalár kifejezések
Lehetőség van konstans skalár kifejezések használatára
const ONE = 1; const TWO = ONE * 2;
class C {
const THREE = TWO + 1; const ONE_THIRD = ONE / self::THREE; const SENTENCE =
'The value of THREE is '.self::THREE;
public function f($a = ONE + self::THREE) {
return $a;
}
}
echo (new C)->f()."\n"; echo C::SENTENCE;
4 The value of THREE is 3
Változó paraméterszámú függvények
Már nem csak a func_get_args() függvény használatával lehet változó
paraméterszámú függvényeket használni, hanem a ... operátorral is.
function f($req, $opt = null, ...$params) {
// $params is an array containing the remaining arguments.
printf('$req: %d; $opt: %d; number of params: %d'."\n",
$req, $opt, count($params));
}
f(1); f(1, 2); f(1, 2, 3); f(1, 2, 3, 4); f(1, 2, 3, 4, 5);
$req: 1; $opt: 0; number of params: 0 $req: 1; $opt: 2;
number of params: 0 $req: 1; $opt: 2; number of params: 1 $req: 1; $opt: 2;
number of params: 2 $req: 1; $opt: 2; number of params: 3
Argument unpacking via ...
Tömbök és Traversable objektumokat is ki lehet csomagolni argumentum listába
függvények hívásakor a ... operátor használatával. Ez más nyelvekben, mint
példál a Ruby-ban "splat operator"-nak nevezik.
function add($a, $b, $c) {
return $a + $b + $c;
}
$operators = [2, 3]; echo add(1, ...$operators);
6
Hatványozás a ** operátorral
A jobb asszociatív ** operátor az hatványozás támogatására szolgál, a **=
rövidített értékadó operátorral együtt.
printf("2 ** 3 == %d\n", 2 ** 3); printf("2 ** 3 ** 2 ==
%d\n", 2 ** 3 ** 2);
$a = 2; $a **= 3; printf("a == %d\n", $a);
2 ** 3 == 8 2 ** 3 ** 2 == 512 a == 8
use function és use const
A use operátor lehet használni függvények és konstansok és osztályok
importálására is.
namespace Name\Space {
const FOO = 42; function f() { echo __FUNCTION__."\n"; }
}
namespace {
use const Name\Space\FOO; use function Name\Space\f;
echo FOO."\n"; f();
}
42 Name\Space\f