为了账号安全,请及时绑定邮箱和手机立即绑定

PHP 对象

标签:
PHP

<?php

header('content-type:text/html;charset=utf-8');

/*

 * __construct()构造方法

 * 在对象初始化时自动调用

 * __destruct()析构方法

 * 在对象释放资源时自动调用

 * __get()取值

 * 在取私有属性值时自动调用

 * __set()设置值

 * 在设置私有属性值自动调用

 * __isset()判断值

 * 在使用isset()判断私有属性是否存在时自动调用

 * __unset()释放值

 * 在使用unset()释放私有属性时自动调用

 * __toString() 用于一个类被当成字符串时应怎样回应

 * __call() 在对象中调用一个不可访问方法时,__call() 会被调用。

 * __callstatic()用静态方式中调用一个不可访问方法时,__callStatic() 会被调用。 :: 

 * __sleep() 在串行化serialize时自动调用的方法

 *  __wakeup() 在反串行化时自动调用的方法

 * __set_state() 当调用 var_export() 导出类时,此静态 方法会被调用。

 * __invoke()当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。

 * __autoload() 唯一一个在类外部进行定义 自动加载 只要在这个脚本中,需要加载类的时候(必须用到类名)就会自动调用这个方法。

 * 

 * 魔术方法的总结:

 * 1.自动调用,但不同的魔术方法,有自己的调用时机

 * 2.都是以__开始的方法

 * 3.所有的魔术方法,方法名都是固定的

 * 4.如果不写,就不存在,也就没有默认的功能。

 * 

 * __toString()

 * 1.是在直接使用echo print printf输出一个对象引用时,自动调用的方法

 * 2.将对象的基本信息放在__toString()方法内部,形成字符串返回。

 * 3.__toString()方法中不能有参数。

 * 

 * 克隆对象

 * 1.使用clone这个关键字复制一个对象

 * 

 * __clone()魔术方法

 * 1.是在克隆对象时自动调用的方法

 * 2.作用:和构造方法一样,是对新克隆的对象进行初始化

 * 

 * __call()

 * 1.就是在调用一个对象中不存的方法时,自动调用的方法

 * 2.有两个参数,第一个参数是,调用的不存在的方法的方法名,第二个参数是调用不存在的方法的方法参数

 * 作用:

 * 1.可以写提示信息 

 * 2.将方法的功能相似,但方法名还要不同的,就可以采用这个方式来完成

 * 

 *

 * 对象串行化  (序列化)

 * 1.将对象转成字符串---串行化

 *  __sleep()

 *  作用:

 *  可以设置需要串行化的对象的属性

 *  只要在这个方法中,返回一个数组,在数组中声明了那个属性名,那个属性名就会被串行化。

 *  没有声明的属性名,不串行化

 *  默认这个方法,全部串行化

 * 2.将字符串转成对象---反串行化

 * __wakeup() 在反串行化时自动调用

 * 作用:

 * 对象串行化的对象回来后,进行对象的初始化,相当于__construct()

 * serialize() 函数会检查类中是否存在一个魔术方法 __sleep() 如果存在,该方法会先被调用,然后才执行序列化操作

 * 注意(串行化时机)

 * 1.将对象需要进行网络传输时。

 * 2.将对象持久保存时。

 * 

 * 数组串行化 json  ----javascript object notation

 * 

 * 1.eval()函数--检查并执行PHP代码 

 * $str = "echo 'abc' ;";

 * eval($str);

 */

  

 

class Person{

    public $name;

    public $age;

    public $sex;

    public $marr = array('eat','drink','song');

    //初始化时调用构造函数

    function __construct($name,$age,$sex){

        $this->name = $name;

        $this->age     = $age;

        $this->sex     = $sex;

    }

    //echo 对象时调用

    function __toString(){

      return '本人的基本信息如下:我是津沙港湾,30岁,男性<br/>';

    }

    //clone对象时调用

    function __clone(){

        echo '克隆一个对象,this是一个副本<br/>';

        $this->name;

        $this->age=20;

        $this->sex;

    }

    /*

     //提示信息

    function __call($method,$args){

        echo '在调用一个对象中不存的方法时自动调用__call<br/>';

        echo "调用的方法{$method}(),参数为:";

        print_r($args);

        echo "不存在<br/>";

    }

    */

    //调用不同的方法名

    function __call($method,$args){

                if(in_array($method, $this->marr)){

                    foreach ($args as $arg)

                    echo $arg."<br/>";

                }else{

                    echo "您调用的方法{$method}()不存在";

                }

    }    

     

    static function __callstatic($method,$args){

        echo "您调用的静态方法{$method}不存在";

    }

     

    function say() {

        echo '我是津沙港湾<br/>';

    }

     

    //串行化 serialize时调用

    function __sleep(){

        echo '指定串行化的对象属性名<br/>';

       return array('name','age');//必须返回数组

       //指定只串行化name和age这个两个对象属性

       //O:6:"Person":2:{s:4:"name";s:12:"津沙港湾";s:3:"age";i:23;}

    }

     

    //反串行化 unserialize时调用

    function __wakeup(){

        echo '反串行化时自动调用<br/>';

        //反串行化时设置成员属性的值

        $this->age = 43;

    }

     

    //var_export导出类信息

    static function __set_state($arr){//参数是数组

        echo 'var_export导出类信息时自动调用<br/>';

        $p = new Person("小状元", 33, "female");

        $p->name = $arr['name'];

        $p->age = $arr['age'];

        $p->sex = $arr['sex'];

        return $p;

    }

     

    //调用函数方式调用对象 $p();

    function __invoke($a,$b,$c){

        echo '调用函数方式调用对象时自动调用'.$a.$b.$c.'<br/>';

    }

     

}

 

//原本

$p = new Person('津沙港湾',23,'男');

 

//toString()

echo $p;

 

//__call()

$p->eat('鱼','肉');

$p->drink('茶','酒');

$p->song('歌','戏');

 

 

//副本 __clone()

$a = clone $p;

echo $a->age;

 

//serialize 对象转成字符串

$str = serialize($p);

//O:6:"Person":4:{s:4:"name";s:12:"津沙港湾";s:3:"age";i:23;s:3:"sex";s:3:"男";s:4:"marr";a:3:{i:0;s:3:"eat";i:1;s:5:"drink";i:2;s:4:"song";}}

file_put_contents("MrYang.txt", $str);

echo '对象串行化成功,保存到MrYang文件中';

 

$arr = array(

        'name' => '津沙港湾',

        'age'    => 32,

        'sex'    => 'male',

    );

    //数组串行化{"name":"\u6d25\u6c99\u6e2f\u6e7e","age":32,"sex":"male"}

    $str = json_encode($arr);

    echo $str;

     

    //数组反串行化 转成对象

    $parr = json_decode($str);

    var_dump($parr);//变成一个对象

    /*

  object(stdClass)[1]

  public 'name' => string '津沙港湾' (length=12)

  public 'age' => int 32

  public 'sex' => string 'male' (length=4)

     */

    //变成一个对象

    echo $parr->name;

    //转成数组 要加第二个参数true

    $parr = json_decode($str,true);

    var_dump($parr);

 

//var_export  __set_state()

$p = new Person("津沙港湾", 20, "male");

//设定的属性可以传到$arr中去

$p->name = '火山岛';

$p->age = 500;

$p->sex = 'male';

eval('$b='.var_export($p,true).';');//加ture变成字符串

var_dump($b);//类信息以__set_state()中设定值为准

//调用函数方式

$p(1,2,3);

//__callstatic 调用不存在的静态方法时自动调用

Person::speak();

//__autoload 调用类中的方法时自动加载类文件

function __autoload($classname){

    include $classname.'.class.php';

}

Test::laugh();


对象反串行化

include 'index.php';

//读取文件内容 字符串

$str = file_get_contents('MrYang.txt');

//反串行化 字符串转成对象

$p = unserialize($str);

 

$p ->say();

echo $p->age;


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消