魔锟斤拷锟斤拷锟斤拷

__construct()锟斤拷 __destruct()锟斤拷 __call()锟斤拷 __callStatic()锟斤拷 __get()锟斤拷 __set()锟斤拷 __isset()锟斤拷 __unset()锟斤拷 __sleep()锟斤拷 __wakeup()锟斤拷 __toString()锟斤拷 __invoke()锟斤拷 __set_state()锟斤拷 __clone() 锟斤拷 __debugInfo() 锟饺凤拷锟斤拷锟斤拷 PHP 锟叫憋拷锟斤拷为魔锟斤拷锟斤拷锟斤拷锟斤拷Magic methods锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟皆硷拷锟斤拷锟洁方锟斤拷时锟斤拷锟斤拷使锟斤拷锟斤拷些锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷使锟斤拷锟斤拷魔锟斤拷锟斤拷锟杰★拷

Caution

PHP 锟斤拷锟斤拷锟斤拷锟斤拷 __锟斤拷锟斤拷锟斤拷锟铰伙拷锟竭o拷锟斤拷头锟斤拷锟洁方锟斤拷锟斤拷锟斤拷为魔锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟节讹拷锟斤拷锟洁方锟斤拷时锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷魔锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟介不要锟斤拷 __ 为前缀锟斤拷

__sleep() 锟斤拷 __wakeup()

public __sleep ( void ) : array
__wakeup ( void ) : void

serialize() 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟角凤拷锟斤拷锟揭伙拷锟侥э拷锟斤拷锟斤拷锟� __sleep()锟斤拷锟斤拷锟斤拷锟斤拷冢锟斤拷梅锟斤拷锟斤拷锟斤拷缺锟斤拷锟斤拷茫锟饺伙拷锟斤拷执锟斤拷锟斤拷锟叫伙拷锟斤拷锟斤拷锟斤拷锟剿癸拷锟杰匡拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷螅锟斤拷锟斤拷锟揭伙拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟接︼拷锟斤拷锟斤拷谢锟斤拷谋锟斤拷锟斤拷锟斤拷频锟斤拷锟斤拷椤o拷锟斤拷锟矫凤拷锟斤拷未锟斤拷锟斤拷锟轿猴拷锟斤拷锟捷o拷锟斤拷 NULL 锟斤拷锟斤拷锟叫伙拷锟斤拷锟斤拷锟斤拷锟斤拷一锟斤拷 E_NOTICE 锟斤拷锟斤拷拇锟斤拷锟�

Note:

__sleep() 锟斤拷锟杰凤拷锟截革拷锟斤拷锟剿斤拷谐锟皆憋拷锟斤拷锟斤拷帧锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷一锟斤拷 E_NOTICE 锟斤拷锟斤拷拇锟斤拷蟆?锟斤拷锟斤拷锟� Serializable 锟接匡拷锟斤拷锟斤拷锟斤拷锟�

__sleep() 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟结交未锟结交锟斤拷锟斤拷锟捷o拷锟斤拷锟斤拷锟狡碉拷锟斤拷锟斤拷锟斤拷锟斤拷锟酵憋拷锟斤拷锟斤拷锟斤拷一些锟杰达拷亩锟斤拷螅锟斤拷锟斤拷锟揭拷锟斤拷锟斤拷妫拷锟斤拷锟斤拷锟杰就很猴拷锟矫★拷

锟斤拷之锟洁反锟斤拷unserialize() 锟斤拷锟斤拷锟角凤拷锟斤拷锟揭伙拷锟� __wakeup() 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷冢锟斤拷锟斤拷锟饺碉拷锟斤拷 __wakeup 锟斤拷锟斤拷锟斤拷预锟斤拷准锟斤拷锟斤拷锟斤拷锟斤拷要锟斤拷锟斤拷源锟斤拷

__wakeup() 锟斤拷锟斤拷锟斤拷锟节凤拷锟斤拷锟叫伙拷锟斤拷锟斤拷锟叫o拷锟斤拷锟斤拷锟斤拷锟铰斤拷锟斤拷锟斤拷锟捷匡拷锟斤拷锟接o拷锟斤拷执锟斤拷锟斤拷锟斤拷锟斤拷始锟斤拷锟斤拷锟斤拷锟斤拷

Example #1 Sleep 锟斤拷 wakeup

<?php
class Connection 
{
    protected 
$link;
    private 
$server$username$password$db;
    
    public function 
__construct($server$username$password$db)
    {
        
$this->server $server;
        
$this->username $username;
        
$this->password $password;
        
$this->db $db;
        
$this->connect();
    }
    
    private function 
connect()
    {
        
$this->link mysql_connect($this->server$this->username$this->password);
        
mysql_select_db($this->db$this->link);
    }
    
    public function 
__sleep()
    {
        return array(
'server''username''password''db');
    }
    
    public function 
__wakeup()
    {
        
$this->connect();
    }
}
?>

__toString()

public __toString ( void ) : string

__toString() 锟斤拷锟斤拷锟斤拷锟斤拷一锟斤拷锟洁被锟斤拷锟斤拷锟街凤拷锟斤拷时应锟斤拷锟斤拷锟斤拷应锟斤拷锟斤拷锟斤拷 echo $obj; 应锟斤拷锟斤拷示些什么锟斤拷锟剿凤拷锟斤拷锟斤拷锟诫返锟斤拷一锟斤拷锟街凤拷锟斤拷锟斤拷锟斤拷锟津将凤拷锟斤拷一锟斤拷 E_RECOVERABLE_ERROR 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟�

Warning

锟斤拷锟斤拷锟斤拷 __toString() 锟斤拷锟斤拷锟斤拷锟阶筹拷锟届常锟斤拷锟斤拷么锟斤拷锟结导锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷

Example #2 锟斤拷示锟斤拷

<?php
// Declare a simple class
class TestClass
{
    public 
$foo;

    public function 
__construct($foo
    {
        
$this->foo $foo;
    }

    public function 
__toString() {
        return 
$this->foo;
    }
}

$class = new TestClass('Hello');
echo 
$class;
?>

锟斤拷锟斤拷锟斤拷锟教伙拷锟斤拷锟斤拷锟�

Hello

锟斤拷要指锟斤拷锟斤拷锟斤拷锟斤拷 PHP 5.2.0 之前锟斤拷__toString() 锟斤拷锟斤拷只锟斤拷锟斤拷直锟斤拷使锟斤拷锟斤拷 echo 锟斤拷 print 时锟斤拷锟斤拷锟斤拷效锟斤拷PHP 5.2.0 之锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷魏锟斤拷址锟斤拷锟斤拷锟斤拷锟斤拷锟叫э拷锟斤拷锟斤拷锟酵拷锟� printf()锟斤拷使锟斤拷 %s 锟斤拷锟轿凤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟节凤拷锟街凤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷使锟斤拷 %d 锟斤拷锟轿凤拷锟斤拷锟斤拷锟斤拷 PHP 5.2.0 锟斤拷锟斤拷锟斤拷锟揭伙拷锟轿达拷锟斤拷锟� __toString() 锟斤拷锟斤拷锟侥讹拷锟斤拷转锟斤拷为锟街凤拷锟斤拷锟斤拷锟斤拷锟斤拷锟� E_RECOVERABLE_ERROR 锟斤拷锟斤拷拇锟斤拷锟�

__invoke()

__invoke ([ $... ] ) : mixed

锟斤拷锟斤拷锟斤拷锟皆碉拷锟矫猴拷锟斤拷锟侥凤拷式锟斤拷锟斤拷一锟斤拷锟斤拷锟斤拷时锟斤拷__invoke() 锟斤拷锟斤拷锟结被锟皆讹拷锟斤拷锟矫★拷

Note:

锟斤拷锟斤拷锟斤拷只锟斤拷 PHP 5.3.0 锟斤拷锟斤拷锟较版本锟斤拷效锟斤拷

Example #3 使锟斤拷 __invoke()

<?php
class CallableClass 
{
    function 
__invoke($x) {
        
var_dump($x);
    }
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
?>

锟斤拷锟斤拷锟斤拷锟教伙拷锟斤拷锟斤拷锟�

int(5)
bool(true)

__set_state()

static __set_state ( array $properties ) : object

锟斤拷 PHP 5.1.0 锟金当碉拷锟斤拷 var_export() 锟斤拷锟斤拷锟斤拷时锟斤拷锟斤拷锟斤拷态 锟斤拷锟斤拷锟结被锟斤拷锟矫★拷

锟斤拷锟斤拷锟斤拷锟斤拷唯一锟斤拷锟斤拷锟斤拷一锟斤拷锟斤拷锟介,锟斤拷锟叫帮拷锟斤拷锟斤拷 array('property' => value, ...) 锟斤拷式锟斤拷锟叫碉拷锟斤拷锟斤拷锟皆★拷

Example #4 使锟斤拷 __set_state()>锟斤拷PHP 5.1.0 锟斤拷

<?php

class A
{
    public 
$var1;
    public 
$var2;

    public static function 
__set_state($an_array// As of PHP 5.1.0
    
{
        
$obj = new A;
        
$obj->var1 $an_array['var1'];
        
$obj->var2 $an_array['var2'];
        return 
$obj;
    }
}

$a = new A;
$a->var1 5;
$a->var2 'foo';

eval(
'$b = ' var_export($atrue) . ';'); // $b = A::__set_state(array(
                                            //    'var1' => 5,
                                            //    'var2' => 'foo',
                                            // ));
var_dump($b);

?>

锟斤拷锟斤拷锟斤拷锟教伙拷锟斤拷锟斤拷锟�

object(A)#2 (2) {
  ["var1"]=>
  int(5)
  ["var2"]=>
  string(3) "foo"
}

__debugInfo()

__debugInfo ( void ) : array

This method is called by var_dump() when dumping an object to get the properties that should be shown. If the method isn't defined on an object, then all public, protected and private properties will be shown.

This feature was added in PHP 5.6.0.

Example #5 Using __debugInfo()

<?php
class {
    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)
}