博客列表 >匿名对象与匿名类的实现过程+Trait类的声明与工作原理+类的自动加载函数的写法+对象的序列化与反序列化的原理与应用+对面向对象编程的基本理解

匿名对象与匿名类的实现过程+Trait类的声明与工作原理+类的自动加载函数的写法+对象的序列化与反序列化的原理与应用+对面向对象编程的基本理解

Belifforz的博客
Belifforz的博客原创
2018年09月11日 12:34:32631浏览

1匿名对象与匿名类的实现过程

实例

<?php

class OnePiece
{
    private $name = '蒙奇D路飞';
    public function story($dream)
    {
        return $this->name . '是一位励志成为'.$dream.'的人';
    }
    
}

//匿名对象:
echo (new OnePiece)->story('海贼王'),'<br>';


//匿名类:
//不需要类名,直接new匿名类出来对象然后直接调用匿名类的方法
echo (new class 
{
    private $name = '蒙奇D路飞';
    public function story($dream)
    {
        return $this->name . '是一位励志要成为'.$dream.'的人';
    }
    
})->story('航海王'),'<br>';


//1.匿名类中可以使用构造方法
echo (new class('罗罗诺亚.索隆') {
    private $name = '';
    public function __construct($name)
    {
        $this->name = $name;
    }
    public function story($dream)
    {
        return $this->name . '励志要成为'.$dream;
    }
    
})->story('世界第一大剑豪'),'<br>';

//2.在匿名类中可以继承其他类中的成员

class Ability
{
    protected $kill;
    public function __construct($art = '')
    {
        $this->kill = $art;
    }

    public function show()
    {
        return $this ->kill ? :'千八百风';
    }
}

echo (new class('罗罗诺亚.索隆','一刀流.三十六烦恼风') extends Ability {
    private $name = '';
    public function __construct($name,$art = '')
    {
        parent::__construct($art);
        $this->name = $name;
    }
    public function story($dream)
    {
        return $this->name . '励志要成为'.$dream;
    }
    public function show()
    {
        return $this->name . '的招式:'.$this ->kill;
    }
    
})->show(),'<br>';

//类中嵌套匿名类
class Goods
{
    public $name = 'IPhone XS';
    private $color = 'blank';
    public function sale()
    {
        //可以把私有属性当作参数传入匿名类,然后构造函数接收
        return (new class($this->color) extends Goods
        {
            private $color = '';
            public function __construct($name){
                $this->color = $name;
            }
            public function date()
            {
                return "苹果新品发布会在9月13日召开,".$this->name."开售预计在10月中旬!敬请期待".$this->color;
            }
        });
    }
}

echo (new Goods())->sale()->date();

运行实例 »

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


2Trait类的声明与工作原理

实例

<?php
/**
 * Trait
 * 1.php只能实现单继承,trait 打破了这限制
 * 2.是代码复用机制
 * 3 是类的语法 单不是类,不能实例 相当于方法集
 */

if(!class_exists('Human')){
    class Human
    {
        protected $name;
        public function __construct($name = '张三')
        {
            $this->name = $name;
        }

        public function study($course = 'php')
        {
            return $this->name . '在学习:'.$course ;
        }
    }
}

//trait
trait Course
{
    public $bro = '李四';
    public function sport($name = '玩游戏')
    {
        return $this->name . '正在练习'.$name;
    }
    public function study($name = 'html')
    {
        return $this->name . '在学习'.$name;
    }

}trait OtherCourse
{
    public $bro = '李四';
    public function study($name = 'html')
    {
        return $this->name . '在学习'.$name;
    }

}

class Student extends Human
{
//    use Course;//导入trait类,类似继承
    //如果导入两个trait,里面相同的方法如果重复,要给定规则:
    use Course,OtherCourse{
        Course::study insteadof OtherCourse;//设置使用Course里面的方法,而不是OtherCourse里面的
        OtherCourse::study as MySport;//把OtherCourse里面的方法给 别名
    }

}

$student = new Student();

echo $student->study('Trait'),'<hr>';
echo $student->sport(),'<hr>';
echo $student->study(),'<hr>';//返回在学习html.说明 子类>trait>父类
echo $student->Mysport(),'<hr>';

运行实例 »

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


3类的自动加载函数的写法

实例

<?php
/**
 * 类 自动加载
 *
 */


spl_autoload_register(function($className){
    require './class/'.$className.'.php';
    //如存在命名空间:
//    $className = str_replace("\\","/",$className);
//    require './class/'.$className.'.php';
});

echo demo1::CLASS_NAME,'<hr>';
echo demo2::CLASS_NAME,'<hr>';

运行实例 »

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


4对象的序列化与反序列化的原理与应用

实例

<?php
/**
 * 对象的序列化与反序列化
 */

class demo4
{
    public $name;
    public $email;

    //对象序列化的时候自动调用
    public function goods(){
        echo $this->email;
    }
    public function __sleep()
    {
        return['name','email'];//传入属性名,返回属性值
    }

    //反序列化
    public function __wakeup()
    {
        $this->email;
        $this->goods();
    }
}
$demo = new demo4();
echo serialize($demo),'<hr>';
//返回   O:5:"demo4":1:{s:4:"name";N;}
/*O:  object对象类型
 *5 :  类名字符长度
 *demo4 :类名
*/
/*
 *对象序列化的特点
 *1只保存对象中的属性,不保存方法
 *2 只保存类名,不保存对象名
 */
$obj = serialize($demo);
var_dump(unserialize($obj));

运行实例 »

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


5.谈谈你对面向对象编程的基本理解

关于面向对象编程,即OOP,它是一种编程范式,满足面向对象编程的语言,一般会提供类、 封装、继承等语法和概念来辅助我们进行面向对象编程。
面向对象是基于万物皆对象这个哲学观点. 所谓的面向对象就是将我们的程序模块化, 对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类 里面
面向对象的三大特征 继承,封装,多态

继承:子类可以继承父类,继承父类的属性及方法,使得代码模块化,提高代码复用性

封装:将事物的属性及行为抽象成一个类,代码模块化,提高代码复用性;

多态:为了实现接口重用,是面向对象的最重要的一部分.

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