Magic Methods

Π’ PHP ΠΊΠ°ΠΊ ΠΈ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… языках Π΅ΡΡ‚ΡŒ magic methods: https://www.php.net/manual/en/language.oop5.magic.php

__sleap() & __wakeup()

ΠœΠ΅Ρ‚ΠΎΠ΄ __sleep() вызываСтся Π΄ΠΎ serialize(). Он ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ поля ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список ΠΏΠΎΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ сСриализованы.

И Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, unserialize() провСряСт Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с магичСским ΠΈΠΌΠ΅Π½Π΅ΠΌ __wakeup(). Если ΠΎΠ½Π° присутствуСт, эта функция ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ рСсурсы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΠΎΠ΅ использованиС __wakeup() состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ соСдинСния с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹Ρ‚ΡŒ потСряны Π²ΠΎ врСмя сСриализации, ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

<?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();
    }
}

?>

__serialize() && __unserialize()

Π˜ΠΌΠ΅ΡŽΡ‚ больший ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π½Π°Π΄ __sleep() ΠΈ __wakeup(). Π‘ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ __serialize() ΠΈ __unserialize().

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

<?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();
    }
}

?>

Last updated