博客列表 >匿名类,Trait类,抽象类;自动加载、序列化与反序列化 2018年9月6号 22:12

匿名类,Trait类,抽象类;自动加载、序列化与反序列化 2018年9月6号 22:12

南通税企通马主任的博客
南通税企通马主任的博客原创
2018年09月07日 14:16:14913浏览

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

实例

<?php
header("content-Type:text/html;charset=UTF-8");
echo '<h1>匿名对象与匿名类的实现过程</h1><hr>';

class Task1
{
    private $name = 'arthur';
    public function sqt($ming)
    {
//        return $this ->name;
        return $this ->name .'是税企通的'.$ming;
    }

}
//对象访问方式:
$task1 = new Task1();
echo $task1 ->sqt('项目流程负责人'),'<br>';

//匿名对象访问方式:
echo (new Task1()) ->sqt('董事局主席'),'<br>';

//匿名类的访问方法:
echo (new class {
         private $name = 'arthur';
         public function sqt($ming)
         {
            return $this ->name .'是税企通的'.$ming;
         }
}) ->sqt('创始人'),'<hr>';

//匿名类的使用场景
//1,在匿名类中使用构造方法
echo (new class('kitty')
{
    private $name;
    public function __construct($ming)
    {
        $this ->name = $ming;
    }
    public function sqt($ming)
    {
        return $this ->name .'是税企通的'.$ming;
    }
}) ->sqt('董事长秘书'),'<hr>';

//2,匿名类继承干爹类成员的方法
class BaBa
{
    private $property;
    public function __construct($gold='')
    {
        $this ->property = $gold;
    }
    public function wo()
    {
        return $this ->property ? : '三千吨黄金';
    }
}

echo (new class('arthur') extends BaBa {
    private $name;
    public  function __construct($ming,$gold='')
    {
        parent::__construct($gold);
        $this ->name = $ming;
    }
    public function wo()
    {
        return $this ->name.'继承了'. parent::wo();
    }
}) ->wo(),'<hr>';

//3,咱们来开始玩类中类,来
class Ceo
{
    public $name = 'tony';
    protected $salary = '1000万';
    private $agree = '保密协议';

    protected function  info()
    {
        return '由税企通培训输出的';
    }
    public function zhong1()
    {
        return (new class($this->agree) extends Ceo
        {
            private $agree;
            public function __construct($agree)
            {
                $this ->agree = $agree;
            }
            public function zhong2()
            {
                return '我是嵌套匿名类中的方法:'.__METHOD__;
            }
            public function show()
            {
                return 'CEO的姓名是:'.$this ->name.'<br>'.
                        'CEO的年薪是:'.$this ->salary.'<br>'.
                        'CEO的协议是:'.$this ->agree.'<br>';
            }

        });
    }
}
echo (new Ceo()) ->zhong1() ->zhong2();

echo '<hr>';

echo (new Ceo()) ->zhong1() ->show();

运行实例 »

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

2、Trait类的声明与工作原理

实例

<?php
header("content-Type:text/html;charset=UTF-8");
echo '<h1>Trait类的声明与工作原理</h1><hr>';

//Trait类严格来说不是类,因为它无法实例化
//Trait类的作用首先是突破了php的单继承,可以多继承了
//其次作为方法集,给需要实例化的类提供了很多可行条件,相当于当前脚本的函数库

class Ba
{
    protected $name;
    public function __construct($name='粑粑')
    {
        $this ->name = $name;
    }
    public function doing($kan='看电视')
    {
        return $this->name.'在客厅'.$kan;
    }
}


trait Ma
{
    public $ma = '麻麻';
    public function doing($wan='玩手机')
    {
        return $this ->name. '在房间' .$wan;
    }
}

trait Ki
{
    public $kk = 'kitty';
    public function doing($cook='做饭')
    {
        return $this ->name. '在厨房' .$cook;
    }
}

class Ai extends Ba
{
    use Ma , Ki
    {
        Ma::doing insteadof Ki;
        Ki::doing as cooking;
    }
}

$ai = new Ai();
//访问父类
echo $ai ->doing(),'<hr>';
//导入trait类访问
echo $ai ->cooking();

运行实例 »

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

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

实例

<?php
header("content-Type:text/html;charset=UTF-8");
echo '<h1>类的自动加载函数的写法</h1><hr>';

//类的自动加载本质上也是为了不让代码过于冗余,俗称要优雅;
//更重要的是,如果有几十上百个类,如果不用加载技术,会烦死!

spl_autoload_register(function ($className){
    require './class/'.$className .'.php';
});

echo Task3_1::CLASS_NAME,'<hr>';
echo Task3_2::CLASS_NAME;

运行实例 »

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

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

实例

<?php
header("content-Type:text/html;charset=UTF-8");
echo '<h1>对象的序列化与反序列化的原理与应用</h1><hr>';

class Sql
{
    public $db = null;
    public $host;
    public $user;
    public $pass;

    public function __construct($host='127.0.0.1',$user='root',$pass='root')
    {
        $this ->host = $host;
        $this ->user = $user;
        $this ->pass = $pass;
//        确保实例化对象的时候能自动连接上数据库
        $this ->connect();
    }

    private function connect()
    {
        $this ->db = mysqli_connect($this ->host,$this ->user,$this ->pass);
    }

//    对象序列化的时候自动调用
    public function __sleep()
    {
        return['host','user','pass'];
    }

//    对象反序列化的时候自动调用
    public function __wakeup()
    {
        $this ->connect();
    }
}

$sql = new Sql;

echo serialize($sql),'<hr>';
$tmp = serialize($sql);
var_dump(unserialize($tmp));

运行实例 »

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

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

个人是这么理解的,面向对象编程首先得确定这些对象是谁,有那些属性,以及用什么方法获得;

既然对象有了,那么我还要考虑到它们的封装、继承和多态用什么来实现,其中主要的一步就是要考虑其封装方式;

根据目前接触到的课程,我理解是需要先区分项目的大小,由于面向对象编程比较规范统一,适合进行大项目编程,分割式编程(即分区块完成,然后进行拼接);

确定该项目是使用面向对象的编程方式之后,就要考虑到到命名空间、interface接口、类的组成结构了;

老师说了,大公司里做项目,一般就是大佬写个接口给你,然后你就拿回去分着写吧。。。

所以总结一下:面向对象编程规范、严谨,有迹可循。相比面向过程编程的方式而言,可扩展性好,后期维护起来比较容易。

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