博客列表 >2018-09-05匿名类+Trait类+类的自动加载+抽象类+接口+对象的克隆与复制+对象的序列化和反序列化

2018-09-05匿名类+Trait类+类的自动加载+抽象类+接口+对象的克隆与复制+对象的序列化和反序列化

阿小的博客
阿小的博客原创
2018年09月09日 21:26:05556浏览

实例

<?php
//1.匿名类  PHP7+才支持
// 2.类似匿名函数,就是没有名称的类
// 3匿名类适合于一次性创建与使用
// 4匿名类总是和new配套使用
class BadPerson
{
    private $name = '西门大官人';
    
    public function story($name)
    {
        return $this->name.'喜欢上了:<span style="color:red">'.$name.'</span><br>';
    }
}
//对象正常的用new实例化
$person = new BadPerson();
echo $person->story('金莲妹妹');

//简写,匿名对象
echo (new BadPerson())->story('灭绝师太');

//匿名累的使用,直接new类,直接在类中写属性和方法
echo (new class{
    private $name = '西门大官人';
    
    public function story($name)
    {
        return $this->name.'喜欢上了:<span style="color:red">'.$name.'</span><hr>';
    }
})->story('武大郎');

//匿名类的三种应用场景
//1.匿名类中可以使用构造方法
echo (new class('段誉') {
    private $name ;
    public function __construct($name)  //如果构造方法有参数,要在new class(参数)
    {
        $this->name = $name;
    }

    public function story($name)
    {
        return $this->name.'喜欢上了:<span style="color:red">'.$name.'</span><br>';
    }
})->story('神仙姐姐');

//2.匿名类可以继承其他类中的成员
class Kungfu    //父类功夫类
{
    private $skill; //技能
    public function __construct($act='')
    {
        $this->skill = $act;
    }
    
    public function show()
    {
        return $this->skill?:'降龙十八掌';    //$this->skill?$this->skill:'凌波微步'的简写
    }
}

echo (new class('乔峰','凌波微步') extends Kungfu{   //子类继承父类
    private $name ;
    public function __construct($name,$act='')  
    {
        parent::__construct($act);      //再次构造父类构造方法
        $this->name = $name;
    }

    public function story($name)
    {
        return $this->name.'喜欢上了:<span style="color:red">'.$name.'</span><br>';
    }
    
    public function show()
    {
        return $this->name.'的绝招是:<span style="color:red">'.parent::show().'</span><br>';    //调用父类的show()方法
    }
})->show();

//3.可以在类声明中嵌套一个类(类种类)
class animal
{
    public $name = '狗';
    protected $color = '白色';
    private $type = '金毛';
    
    public function test()
    {
        return (new class( $this->type) extends animal{   //继承animal类
            //访问宿主类中私有属性的方法:1.创建一个变量来接收传过来的私有属性
            //2.创建构造函数    3.将宿主类中的私有变量作为参数传递进来
            private $type;
            
            public function __construct($type)
            {
                $this->type = $type;
            }
            
            public function testtest()
            {
                return '当前嵌套类的方法是'.__METHOD__.'<br>';
            }
            
            public function show()
            {
                return 
                    '当前的动物是'.$this->name.'<br>'.
                    '当前的动物的颜色是'.$this->color.'<br>'.
                '当前的动物的颜色是'.$this->type.'<br>';//不能直接访问父类中的私有属性,可以在匿名类中创建一个构造方法将宿主类中的私有成员进行注入
                
            }
        });
    }
}

echo (new animal())->test()->testtest();     //(new animal())-test()返回的是匿名类,可以直接调用该匿名类下的方法

echo (new animal())->test()->show();

运行实例 »

点击 "运行实例" 按钮查看在线实例


Trait类

实例

<?php
//php只能实现单继承,Trait打破了限制
// Trait是一种代码复用机制
// Trait使用类的语法,但不是类,不能实例化
// Trait相当于方法集
class Person
{
    protected $name;
    
    public function __construct($name='张三')
    {
        $this->name = $name;
    } 
    
    public function study($course='PHP')
    {
        return $this->name.'在学习'.$course.'<hr>';
    }
    
} 

Trait Course
{
    public $friend1 = '李四';
    public function sport($sport='踢足球')
    {
        return $this->name.'在学习'.$sport.'<hr>';
    }
    
    //父类、Trait类、和子类的关系:Trait类位于父类和子类之间
    public function study($sport='踢足球')
    {
        return $this->name.'在学习'.$sport.'<hr>';
    }
}

Trait Hobby
{
    public $friend2 = '王五';
    public function study($sport='打乒乓球')
    {
        return $this->name.'和'.$this->friend2.'在'.$sport.'<hr>';
    }
}

class Student extends Person
{
//     use Course; //用use关键字来导入Trait  
//     use Hobby;
    use Course,Hobby{       //Course和Hobby中有同名函数,直接引用会报错
        Hobby::study insteadof Course;  //将Course中的study代替Hobby中的
        Course::study as MySport;        //将Hobby中的Study起别名,可以用别用来调用
    }
}

$student = new Student();
echo $student->study();
echo $student->MySport();

运行实例 »

点击 "运行实例" 按钮查看在线实例


类的自动加载spl_autoload_register()

实例

<?php
// 类的自动加载spl_autoload_register()

// require 'class1.php';
// require 'class2.php';
spl_autoload_register(function($className){
    require $className.'.php';      //$className要加载的类名
});

echo Class1::CLASS_NAME.'<hr>';
echo Class2::CLASS_NAME.'<hr>';

运行实例 »

点击 "运行实例" 按钮查看在线实例


对象的序列化serialize()和反序列化unserialize()

实例

<?php
//序列化serialize(),反序列化unserialize()
$num = 1000;
echo serialize($num).'<br>';    //整数的序列化

$string = 'PHP';
echo serialize($string ).'<br>';    //字符串的序列化

$arr = ['PHP','HTML','JS'];
echo serialize($arr).'<hr>';    //数组的序列化

class Db
{
    private $host;
    private $user;
    private $pass;
    private $dn = null;
    
    public function __construct($host='127.0.0.1',$user='root',$pass='123456')
    {
        $this->host = $host;
        $this->user = $user;
        $this->pass = $pass;
        
        //确保对象实例化是直接连接数据库
        $this->connect();
    }
    private function connect()
    {
        $this->db = mysqli_connect($this->host, $this->user, $this->pass);
    }
    
    //__sleep()魔术方法,在对象序列化时调用,没有参数
    public function __sleep()
    {
        return ['host','user','pass'];
    }
    
    //__wakeup()魔术方法,在对象反序列化时调用
    public function __wakeup()
    {
        return $this->connect();
    }
}

$obj = new Db();
/* 对象序列化的特点
1.只保存对象名,不保存方法名
2.只保存类名,不保存对象名 */
echo serialize($obj).'<hr>';
$tmp = serialize($obj);
var_dump(unserialize($tmp));

运行实例 »

点击 "运行实例" 按钮查看在线实例


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议