PHP魔法方法与序列化和反序列化
序列化与反序列化
数组的序列化
$stu = [ 'tom' , 'berry' , 'ketty' ] ;
$str = serialize ( $stu ) ;
file_put_contents ( './a.txt' , $str ) ;
数组的反序列化
$str = file_get_contents ( './a.txt' ) ;
$stu = unserialize ( $str ) ;
echo '<pre>' ;
var_dump ( $stu ) ;
print_r ( $stu ) ;
魔术方法
知识点:
1. __construct():构造函数
2. __destruct():析构函数
3. __clone():调用clone指令的时候调用
4. __tostring():将对象当成字符串使用的时候自动调用
5. __invoke():将对象当成函数的时候自动调用
6. __set():给无法访问的属性赋值的时候自动调用
7. __get():获取无法访问的属性自动调用
8. __isset():判断无法访问的属性是否存在自动调用
9. __unset():销毁无法访问的属性的时候自动执行
10. __call():调用无法访问的方法时自动执行
11. __callstatic():调用无法访问的静态方法的时候自动执行
12. __sleep():当序列化的时候自动执行
13. __wakeup():当反序列化的时候自动执行
clone与__clone()
1. 创建对象的方法有:
2. 实例化
3. 克隆
class Student{
public function __clone ( )
{
echo '正在克隆对象<br>' ;
}
}
$stu = new Student ( ) ;
$stu2 = clone $stu ;
var_dump ( $stu , $stu2 ) ;
echo '<br>' ;
小结:
1. clone的创建对象方法之一
2. 当执行clone指令的时候,会自动调用__clone()方法
__tostring和__invoke
class Student{
public function __toString ( )
{
return '这是一个对象,不是字符串<br>' ;
}
public function __invoke ( )
{
echo '这是一个对象,不是函数<br>' ;
}
}
$stu = new Student ;
echo $stu ;
$stu ( ) ;
__set()、__get()、__isset()
class A {
private $name ;
private $sex ;
private $age ;
public function __set ( $name , $value )
{
$this -> $name = $value ;
}
public function __get ( $name )
{
return $this -> $name ;
}
public function __isset ( $name )
{
return isset ( $this -> $name ) ;
}
}
$a = new A ( ) ;
$a -> name = 'tom' ;
$a -> sex = '男' ;
$a -> age = 22 ;
echo $a -> name , '<br>' ;
var_dump ( isset ( $a -> name ) ) ;
例题
class B {
private $name ;
private $add = '中国' ;
private $age ;
public function __set ( $name , $value )
{
if ( in_array ( $name , array ( 'name' , 'age' ) ) ) {
$this -> $name = $value ;
}
else {
echo "{ $name } 属性是只读属性<br>" ;
}
}
public function __get ( $name )
{
if ( in_array ( $name , array ( 'name' , 'add' ) ) ) {
return $this -> $name ;
}
else
echo "{ $name } 是只写属性<br>" ;
}
}
$b = new B ( ) ;
$b -> name = 'tom' ;
$b -> age = 88 ;
echo '姓名:' . $b -> name , '<br>' ;
echo '地址:' . $b -> add , '<br>' ;
__call()与__callstatic()
class C {
public function __call ( $name , $arguments )
{
echo "{ $name } 不存在<br>" ;
}
public static function __callStatic ( $name , $arguments )
{
echo "{ $name } 静态方法不存在<br>" ;
}
}
$c = new C ( ) ;
$c -> show ( 11 , 22 ) ;
C :: show ( ) ;
__sleep()、__wakeup()
class E {
private $add = '中国' ;
private $name ;
private $sex ;
public function __construct ( $name , $sex )
{
$this -> name = $name ;
$this -> sex = $sex ;
}
public function __sleep ( )
{
return array ( 'name' , 'age' ) ;
}
public function __wakeup ( )
{
$this -> type = '学生' ;
}
}
$e = new E ( 'TOM' , '男' ) ;
$str = serialize ( $e ) ;
echo $str , '<br>' ;
使用魔法方法实现重载
class Math{
public function __call ( $name , $arguments )
{
$sum = 0 ;
foreach ( $arguments as $v ) :
$sum += $v ;
endforeach ;
echo implode ( ',' , $arguments ) . '的和为:' . $sum . '<br>' ;
}
}
$math = new Math ( ) ;
$math -> add ( 10 , 20 ) ;
$math -> add ( 10 , 30 , 40 ) ;