ħ������

__construct()�� __destruct()�� __call()�� __callStatic()�� __get()�� __set()�� __isset()�� __unset()�� __sleep()�� __wakeup()�� __toString()�� __invoke()�� __set_state()�� __clone() �� __debugInfo() �ȷ����� PHP �б���Ϊħ��������Magic methods�����������Լ����෽��ʱ����ʹ����Щ����������������ʹ����ħ�����ܡ�

Caution

PHP �������� __�������»��ߣ���ͷ���෽������Ϊħ�������������ڶ����෽��ʱ����������ħ�����������鲻Ҫ�� __ Ϊǰ׺��

__sleep() �� __wakeup()

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

serialize() �������������Ƿ����һ��ħ������ __sleep()��������ڣ��÷������ȱ����ã�Ȼ���ִ�����л��������˹��ܿ�������������󣬲�����һ����������������Ӧ�����л��ı������Ƶ����顣����÷���δ�����κ����ݣ��� NULL �����л���������һ�� E_NOTICE ����Ĵ���

Note:

__sleep() ���ܷ��ظ����˽�г�Ա�����֡������������һ�� E_NOTICE ����Ĵ��󡣿����� Serializable �ӿ��������

__sleep() �����������ύδ�ύ�����ݣ������Ƶ����������ͬʱ�������һЩ�ܴ�Ķ��󣬵�����Ҫȫ�����棬������ܾͺܺ��á�

��֮�෴��unserialize() �����Ƿ����һ�� __wakeup() ������������ڣ�����ȵ��� __wakeup ������Ԥ��׼��������Ҫ����Դ��

__wakeup() �������ڷ����л������У��������½������ݿ����ӣ���ִ��������ʼ��������

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)
}