2017-11-26 1 views
0

Mein Beispiel:Wie Klasse zu __sleep hinzufügen?

<?php 

class PDO2 { 
    private $dsn, $username, $password; 

    public function __construct($dsn, $username, $password) 
    { 
     $this->dsn = $dsn; 
     $this->username = $username; 
     $this->password = $password; 
    } 
} 

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 PDO2($this->dsn, $this->username, $this->password); 
    } 

    public function __wakeup() 
    { 
     $this->connect(); 
    } 
} 

$c = new Connection('aaaa', 'bbb', 'ccc'); 

$s = serialize($c); 

print_r($s); 

Diese Rückkehr:

O: 10: "Connection": 4: {s: 7: "* link"; O: 4: "PDO2": 3 : {s: 9: "PDO2dsn"; s: 4: "aaaa"; s: 14: "PDO2-Benutzername"; s: 3: "bbb"; s: 14: "PDO2password"; s: 3: "ccc"; } s: 15: "Connectiondsn"; s: 4: "aaaa"; s: 20: "Verbindungsbenutzername"; s: 3: "bbb"; s: 20: "Verbindungskennwort"; s: 3: "ccc";}

Aber ich möchte hinzufügen, um __sleep magische Methode nur PDO2, Benutzername und DNS:

public function __sleep() 
{ 
    return array('dsn', 'username', 'PDO2'); 
} 

Aber ich habe bemerkt:

Notice: serialize(): &quot;PDO2&quot; returned as member variable from __sleep() but does not exist in 

dieses:

public function __sleep() 
{ 
    return array('dsn', 'username'); 
} 

gut funktioniert.

Wie kann ich die Klasse PDO2 an __sleep übergeben?

+0

Der Hinweis sagt Ihnen genau, was vor sich geht: Es gibt keine Membervariable (Eigenschaft) in der Klasse 'Connection' namens' PDO2'. Sie haben der Eigenschaft 'link' eine Instanz von' PDO2' zugewiesen, also sollte das Array, das Sie in '__sleep()' zurückgeben, 'array ('dsn', 'username', 'link')' sein. –

Antwort

0

Es war nicht klar in Ihrer Frage, wo __sleep war, aber ich gehe davon aus, in Connection. Sache ist, dass ich keine PDO2 Eigenschaft darin sehe.

Aber Sie haben dies.

//$this->link = new PDO2($this->dsn, $this->username, $this->password); 

public function __sleep() 
{ 
    return array('dsn', 'username', 'link'); 
} 

auch nur aus ästhetischer Sicht, brauchen Sie diese nicht in Eigenschaften

private $dsn, $username, $password; 

speichern Nachdem Sie Ihre Verbindung mit dem DB gemacht, sie sind nicht mehr erforderlich.

Verwandte Themen