ΠΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ
ΠΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ β ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ PHP ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ,
ΠΊΠΎΠ³Π΄Π° Π½Π°Π΄ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ.
ΠΡΠ΅Π΄ΠΎΡΡΠ΅ΡΠ΅ΠΆΠ΅Π½ΠΈΠ΅
ΠΠ°Π·Π²Π°Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ Ρ Π΄Π²ΡΡ
ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΏΠΎΠ΄ΡΡΡΠΊΠΈΠ²Π°Π½ΠΈΡ __, Π·Π°ΡΠ΅Π·Π΅ΡΠ²ΠΈΡΠΎΠ²Π°Π»ΠΈ Π² PHP,
ΠΏΠΎΡΡΠΎΠΌΡ Π»ΡΡΡΠ΅ Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌ ΡΠ°ΠΊΠΈΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΡ, Π΅ΡΠ»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ
ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ PHP.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΊ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΠΌ:
__construct(),
__destruct(),
__call(),
__callStatic(),
__get(),
__set(),
__isset(),
__unset(),
__serialize(),
__unserialize(),
__sleep(),
__wakeup(),
__toString(),
__invoke(),
__set_state(),
__clone() ΠΈ
__debugInfo()
ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅
ΠΡΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ ΡΠΈΠΏΠΎΠ² Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠΎΠ²ΡΠΎΡΡΡΡ ΡΠΈΠ³Π½Π°ΡΡΡΡ,
ΠΊΠΎΡΠΎΡΡΡ ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΡΠΎΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ,
ΠΈΠ½Π°ΡΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ ΡΠ°ΡΠ°Π»ΡΠ½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°.
ΠΠΎ PHP 8.0.0 Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π½Π΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ»ΠΈΡΡ.
ΠΡΠΈ ΡΡΠΎΠΌ Π² ΠΌΠ΅ΡΠΎΠ΄Π°Ρ
__construct()
ΠΈ __destruct() ΡΠΈΠΏ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° Π½Π΅ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ,
ΠΈΠ½Π°ΡΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ ΡΠ°ΡΠ°Π»ΡΠ½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°.
public function __serialize():
array
public function __unserialize(
array $data):
void
Π€ΡΠ½ΠΊΡΠΈΡ serialize() ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π»ΠΈ Π² ΠΊΠ»Π°ΡΡΠ΅
ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ __serialize(). ΠΠ΅ΡΠΎΠ΄,
Π΅ΡΠ»ΠΈ Π΅Π³ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π² ΠΊΠ»Π°ΡΡΠ΅, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ. Π¦Π΅Π»Ρ ΠΌΠ΅ΡΠΎΠ΄Π° β Π²Π΅ΡΠ½ΡΡΡ
Π°ΡΡΠΎΡΠΈΠ°ΡΠΈΠ²Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² ΠΏΠ°Ρ Β«ΠΊΠ»ΡΡ β Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅Β» Π΄Π»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΠΎΡΠΌΠ΅.
ΠΡΠΈ Π½Π΅Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅ ΠΌΠ°ΡΡΠΈΠ²Π° Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ° TypeError.
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅:
ΠΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π² ΠΊΠ»Π°ΡΡΠ΅ ΠΎΠ±ΠΎΠΈΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² β
ΠΈ __serialize(), ΠΈ __sleep(),
PHP Π²ΡΠ·ΠΎΠ²Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΠΎΠ΄ __serialize().
ΠΠ΅ΡΠΎΠ΄ __sleep() ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ.
PHP ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ serialize(), ΠΈ Π²ΠΌΠ΅ΡΡΠΎ Π½Π΅Π³ΠΎ
Π²ΡΠ·ΠΎΠ²Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ __serialize(),
Π΅ΡΠ»ΠΈ ΠΊΠ»Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Serializable.
ΠΠ°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° __serialize() Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΡΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Π΄Π»Ρ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ
ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π½ΠΎ ΡΡΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ.
Π Π½Π°ΠΎΠ±ΠΎΡΠΎΡ, ΡΡΠ½ΠΊΡΠΈΡ unserialize() ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ
Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° __unserialize().
PHP ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΌΠ°ΡΡΠΈΠ², ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» ΠΈ Π²Π΅ΡΠ½ΡΠ» ΠΌΠ΅ΡΠΎΠ΄
__serialize(), Π΅ΡΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π² ΠΊΠ»Π°ΡΡΠ΅.
Π Π·Π°ΡΠ΅ΠΌ, Π΅ΡΠ»ΠΈ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ, ΠΌΠ΅ΡΠΎΠ΄ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π°.
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅:
ΠΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π² ΠΊΠ»Π°ΡΡΠ΅ ΠΎΠ±ΠΎΠΈΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² β
ΠΈ __unserialize(), ΠΈ __wakeup(),
PHP Π²ΡΠ·ΠΎΠ²Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΠΎΠ΄ __unserialize(),
Π° ΠΌΠ΅ΡΠΎΠ΄ __wakeup() ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ.
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅:
ΠΠ΅ΡΠΎΠ΄ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Ρ PHP 7.4.0.
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΡΠΈΠΌΠ΅Ρ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ
<?php
class Connection
{
protected $link;
private $dsn, $username, $password;
public function __construct($dsn, $username, $password)
{
$this->dsn = $dsn;
$this->username = $username;
$this->password = $password;
$this->connect();
}
private function connect()
{
$this->link = new PDO($this->dsn, $this->username, $this->password);
}
public function __serialize(): array
{
return [
'dsn' => $this->dsn,
'user' => $this->username,
'pass' => $this->password,
];
}
public function __unserialize(array $data): void
{
$this->dsn = $data['dsn'];
$this->username = $data['user'];
$this->password = $data['pass'];
$this->connect();
}
}
?>
public function __sleep():
array
public function __wakeup():
void
Π€ΡΠ½ΠΊΡΠΈΡ serialize() ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π»ΠΈ
Π² ΠΊΠ»Π°ΡΡΠ΅ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ __sleep().
ΠΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄, Π΅ΡΠ»ΠΈ Π΅Π³ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ. Π ΠΌΠ΅ΡΠΎΠ΄Π΅ ΠΎΡΠΈΡΠ°ΡΡ
ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΡΠ΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, Π΅ΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ, ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΈΠ· ΠΌΠ΅ΡΠΎΠ΄Π° ΠΌΠ°ΡΡΠΈΠ² Ρ Π½Π°Π·Π²Π°Π½ΠΈΡΠΌΠΈ
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ.
ΠΡΠΈ Π½Π΅Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅ ΠΈΠ· ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° null
ΠΈ Π²ΡΠ΄Π°ΡΡΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ E_NOTICE.
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅:
ΠΠ΅ΡΠΎΠ΄Ρ __sleep() Π½Π΅Π»ΡΠ·Ρ
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ Π½Π°Π·Π²Π°Π½ΠΈΡ Π·Π°ΠΊΡΡΡΡΡ
ΡΠ²ΠΎΠΉΡΡΠ² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΡ
ΠΊΠ»Π°ΡΡΠΎΠ².
ΠΡΠΎ ΡΠ³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΎΡΠΈΠ±ΠΊΡ ΡΡΠΎΠ²Π½Ρ E_NOTICE.
ΠΠ»Ρ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π·Π°ΠΊΡΡΡΡΡ
ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΡ
ΡΠ²ΠΎΠΉΡΡΠ² Π²ΠΌΠ΅ΡΡΠΎ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° __sleep Π²ΡΠ·ΡΠ²Π°ΡΡ
ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ __serialize().
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅:
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ PHP 8.0.0 ΠΏΡΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅ ΠΈΠ· ΠΌΠ΅ΡΠΎΠ΄Π° __sleep()
Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΡΠΎΠΌΠ΅ ΠΌΠ°ΡΡΠΈΠ²Π° Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅.
Π Π°Π½ΡΡΠ΅ Π²ΡΠ΄Π°Π²Π°Π»ΠΎΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅.
ΠΠ°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° __sleep() β
Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ»ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΎΡΠΈΡΡΠΊΠΈ.
ΠΠ΅ΡΠΎΠ΄ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ, ΠΊΠΎΠ³Π΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
Π Π½Π°ΠΎΠ±ΠΎΡΠΎΡ, ΡΡΠ½ΠΊΡΠΈΡ unserialize() ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ
Π² ΠΊΠ»Π°ΡΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ
__wakeup().
ΠΠ΅ΡΠΎΠ΄Ρ ΠΏΡΠΎΠ±ΡΠΆΠ΄Π΅Π½ΠΈΡ, Π΅ΡΠ»ΠΈ Π΅Π³ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π² ΠΊΠ»Π°ΡΡΠ΅, Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π»ΡΠ±ΡΡ
ΡΠ΅ΡΡΡΡΠΎΠ²,
ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ.
ΠΠ°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° __wakeup() β
Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ
,
ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΡΠ΅ΡΡΠ»ΠΈΡΡ ΠΏΡΠΈ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ,
ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π΄ΡΡΠ³ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
ΠΡΠΈΠΌΠ΅Ρ #2 ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΡΡΠΏΠ°Π½ΠΈΡ ΠΈ ΠΏΡΠΎΠ±ΡΠΆΠ΄Π΅Π½ΠΈΡ
<?php
class Connection
{
protected $link;
private $dsn, $username, $password;
public function __construct($dsn, $username, $password)
{
$this->dsn = $dsn;
$this->username = $username;
$this->password = $password;
$this->connect();
}
private function connect()
{
$this->link = new PDO($this->dsn, $this->username, $this->password);
}
public function __sleep()
{
return array('dsn', 'username', 'password');
}
public function __wakeup()
{
$this->connect();
}
}
?>
public function __toString():
string
ΠΠ΅ΡΠΎΠ΄ __toString() ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΠΊΠ»Π°ΡΡΡ Π²ΡΠ±ΠΈΡΠ°ΡΡ,
ΠΊΠ°ΠΊ ΠΊΠ»Π°ΡΡ Π±ΡΠ΄Π΅Ρ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ, ΠΊΠΎΠ³Π΄Π° Ρ Π½ΠΈΠΌ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊΠ°ΠΊ ΡΠΎ ΡΡΡΠΎΠΊΠΎΠΉ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠ»Π°ΡΡ ΡΠ΅ΡΠ°Π΅Ρ, ΡΡΠΎ Π²ΡΠ²Π΅Π΄Π΅Ρ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ echo $obj;.
ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅
Π‘ PHP 8.0.0 Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠ΅ PHP-ΡΠΈΠΏΠΎΠ²,
ΠΏΠΎΡΡΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ ΡΡΡΠΎΠΊΠ΅ (string), Π΅ΡΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ
ΠΈ Π΅ΡΠ»ΠΈ ΠΎΡΠΊΠ»ΡΡΠΈΠ»ΠΈ ΡΡΡΠΎΠ³ΡΡ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ.
ΠΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Stringable,
Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠΈΠΏΠ° string,
Π΅ΡΠ»ΠΈ Π²ΠΊΠ»ΡΡΠΈΠ»ΠΈ ΡΡΡΠΎΠ³ΡΡ ΡΠΈΠΏΠΈΠ·Π°ΡΠΈΡ.
ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ
ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Stringable ΠΈ ΡΡΡΠΎΠΊΡ (string)
ΡΠ΅ΡΠ΅Π· ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ², Π΅ΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.
Π‘ PHP 8.0.0 ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ»Π°ΡΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠΏΠΈΡΠ°Π»ΠΈ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ __toString(),
Π½Π΅ΡΠ²Π½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Stringable, ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ
ΠΏΡΠΎΡ
ΠΎΠ΄ΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΡΠΈΠΏΠ° Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°.
Π ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΊΠ»Π°ΡΡΠ° ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡΡ ΡΠ²Π½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ, ΡΡΠΎ ΠΊΠ»Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.
Π PHP 7.4 Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΠΠΠΠΠ
ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΡ ΡΠΈΠΏΡ string, ΠΈΠ½Π°ΡΠ΅ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ° Error.
ΠΠΎ PHP 7.4.0 Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°ΡΡ
ΡΠΈΠΏΡ string, ΠΈΠ½Π°ΡΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»Π° ΡΠ°ΡΠ°Π»ΡΠ½Π°Ρ
ΠΎΡΠΈΠ±ΠΊΠ° ΡΡΠΎΠ²Π½Ρ E_RECOVERABLE_ERROR.
ΠΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅
ΠΠΎ PHP 7.4.0 Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»Π° ΡΠ°ΡΠ°Π»ΡΠ½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°, Π΅ΡΠ»ΠΈ ΠΈΠ· ΠΌΠ΅ΡΠΎΠ΄Π°
__toString()
Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π»ΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅.
ΠΡΠΈΠΌΠ΅Ρ #3 ΠΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ
<?php
// ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°
class TestClass
{
public $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
public function __toString()
{
return $this->foo;
}
}
$class = new TestClass('ΠΡΠΈΠ²Π΅Ρ');
echo $class;
?>
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
function __invoke(
...$values):
mixed
ΠΠ΅ΡΠΎΠ΄ __invoke()
Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΠΊΡΠΈΠΏΡ ΠΏΡΡΠ°Π΅ΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡ.
ΠΡΠΈΠΌΠ΅Ρ #4 ΠΡΠΈΠΌΠ΅Ρ Π²ΡΠ·ΠΎΠ²Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΊΠ»Π°ΡΡΠ° Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ __invoke()
<?php
class CallableClass
{
public function __invoke($x)
{
var_dump($x);
}
}
$obj = new CallableClass();
$obj(5);
var_dump(is_callable($obj));
?>
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
ΠΡΠΈΠΌΠ΅Ρ #5 ΠΡΠΈΠΌΠ΅Ρ Π²ΡΠ·ΠΎΠ²Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΊΠ»Π°ΡΡΠ° Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ __invoke()
<?php
class Sort
{
private $key;
public function __construct(string $key)
{
$this->key = $key;
}
public function __invoke(array $a, array $b): int
{
return $a[$this->key] <=> $b[$this->key];
}
}
$customers = [
['id' => 1, 'first_name' => 'John', 'last_name' => 'Do'],
['id' => 3, 'first_name' => 'Alice', 'last_name' => 'Gustav'],
['id' => 2, 'first_name' => 'Bob', 'last_name' => 'Filipe']
];
// Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ
usort($customers, new Sort('first_name'));
print_r($customers);
// Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ² ΠΏΠΎ ΡΠ°ΠΌΠΈΠ»ΠΈΠΈ
usort($customers, new Sort('last_name'));
print_r($customers);
?>
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
Array
(
[0] => Array
(
[id] => 3
[first_name] => Alice
[last_name] => Gustav
)
[1] => Array
(
[id] => 2
[first_name] => Bob
[last_name] => Filipe
)
[2] => Array
(
[id] => 1
[first_name] => John
[last_name] => Do
)
)
Array
(
[0] => Array
(
[id] => 1
[first_name] => John
[last_name] => Do
)
[1] => Array
(
[id] => 2
[first_name] => Bob
[last_name] => Filipe
)
[2] => Array
(
[id] => 3
[first_name] => Alice
[last_name] => Gustav
)
)
ΠΡΠΎΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄
Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π΄Π»Ρ ΡΠ΅Ρ
ΠΊΠ»Π°ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ
var_export().
ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° β ΠΌΠ°ΡΡΠΈΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΡΠ΅
ΡΠ²ΠΎΠΉΡΡΠ²Π° Π² Π²ΠΈΠ΄Π΅ ['property' => value, ...].
ΠΡΠΈΠΌΠ΅Ρ #6 ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π° __set_state()
<?php
class A
{
public $var1;
public $var2;
public static function __set_state($an_array)
{
$obj = new A;
$obj->var1 = $an_array['var1'];
$obj->var2 = $an_array['var2'];
return $obj;
}
}
$a = new A();
$a->var1 = 5;
$a->var2 = 'foo';
$b = var_export($a, true);
var_dump($b);
eval('$c = ' . $b . ';');
var_dump($c);
?>
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
string(60) "A::__set_state(array(
'var1' => 5,
'var2' => 'foo',
))"
object(A)#2 (2) {
["var1"]=>
int(5)
["var2"]=>
string(3) "foo"
}
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅:
ΠΡΠΈ ΡΠΊΡΠΏΠΎΡΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΡΠ½ΠΊΡΠΈΡ var_export() Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ,
ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ Π»ΠΈ ΠΊΠ»Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΌΠ΅ΡΠΎΠ΄ __set_state(),
ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠΉ ΠΈΠΌΠΏΠΎΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π²ΡΠ±ΡΠΎΡΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Error,
Π΅ΡΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ __set_state() Π½Π΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΡΡΠΎ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ ΡΡΠ΄Ρ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ
ΠΊΠ»Π°ΡΡΠΎΠ².
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ Π½Π΅ΡΡΡ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠΉ
ΠΈΠΌΠΏΠΎΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅Ρ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΊΠ»Π°ΡΡ ΠΊΠΎΡΠΎΡΡΡ
ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄ __set_state().
function __debugInfo():
array
ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ var_dump(), ΠΊΠΎΠ³Π΄Π°
ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΡΠ²Π΅ΡΡΠΈ ΡΠΏΠΈΡΠΎΠΊ ΡΠ²ΠΎΠΉΡΡΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠ°. Π€ΡΠ½ΠΊΡΠΈΡ Π²ΡΠ²Π΅Π΄Π΅Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ
c ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ°ΠΌΠΈ public, protected ΠΈ private,
Π΅ΡΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ.
ΠΡΠΈΠΌΠ΅Ρ #7 ΠΡΠΈΠΌΠ΅Ρ Π²ΡΠ²ΠΎΠ΄Π° ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ __debugInfo()
<?php
class C
{
private $prop;
public function __construct($val)
{
$this->prop = $val;
}
public function __debugInfo()
{
return [
'propSquared' => $this->prop ** 2,
];
}
}
var_dump(new C(42));
?>
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
object(C)#1 (1) {
["propSquared"]=>
int(1764)
}