Blogger Information
Blog 28
fans 0
comment 0
visits 15811
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
2018-09-05匿名类+Trait类+类的自动加载+抽象类+接口+对象的克隆与复制+对象的序列化和反序列化
阿小的博客
Original
553 people have browsed it

实例

<?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));

运行实例 »

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


Correction status:Uncorrected

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post