博客列表 >类与对象的进阶知识 —2018年9月5日23时45分

类与对象的进阶知识 —2018年9月5日23时45分

感恩的心的博客
感恩的心的博客原创
2018年09月20日 02:43:27521浏览

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

实例

<?php
/*编程: 匿名对象与匿名类的实现过程;*/

class Animal{
    public $name='dog';
    protected $color='green';
    private $type='哈士奇';
    
    protected function info(){
        return 'Thanks.';
    }
    
    public function demo1(){
        return (new class($this->type)extends Animal{
        private $type;
        
        public function __construct($type) {
            $this->type=$type;
        }
        
        public function demo2(){
            return 'I am method:'.__METHOD__.'<br>';
        }






        });
        
    }
    
    
    
}

echo (new Animal())->demo1()->demo2();

运行实例 »

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


2、编程: Trait类的声明与工作原理;

实例

<?php
/**
 * Trait 是什么东西?
 * 1. php 只能实现单继承,trait打破了限制
 * 2. trait 是代码复用机制(函数, 类的继承)
 * 3. trait 使的类的语法,但不是类,所以不能实例化
 * 4. triat 相当于方法集
 */

if(!class_exists('Person')){
    class Person{
    protected $name;
    public function __construct($name='颜回') {
        $this->name=$name;
    }
    
    public function study($course='礼教'){
        return $this->name.'学习'.$course.'<br>';
    }
    }
}

trait friend1{
    public $friend1='子贡';
    public function study($course = '春秋'){
        return $this->name . '学习' . $course . '<br>';
    }
}

trait friend2 {

    public $friend2 = '子路';

    public function study($course = '德行') {
        return $this->name . '学习' . $course . '<br>';
    }

}

//父类Person与trait类之间的关系
//trait位于Person与Student之间
class Student extends Person{
use friend1,friend2{
        friend1::study insteadof friend2;
        friend2::study as MySport;
}

}

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

运行实例 »

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


3、 编程: 类的自动加载函数的写法;

实例

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

echo Demo1::COMMON_NAME;
echo Demo2::COMMON_NAME;

运行实例 »

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


4、编程: 对象的序列化与反序列化的原理与应用;

实例

<?php

class Db{
    public $Db=null;
    public $host;
    public $user;
    public $pass;
    
        //构造方法
    public function __construct($host = '127.0.0.1', $user = 'root', $pass = 'root123') {
        $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();
}

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

运行实例 »

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


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

引自网络:面向对象是向现实世界模型的自然延伸,这是一种“万物皆对象”的编程思想。在现实生活中的任何物体都可以归为一类事物,而每一个个体都是一类事物的实例。面向对象的编程是以对象为中心,以消息为驱动,所以程序=对象+消息。

面向对象有三大特性,封装、继承和多态。

封装就是将一类事物的属性和行为抽象成一个类,使其属性私有化,行为公开化,提高了数据的隐秘性的同时,使代码模块化。这样做使得代码的复用性更高。

继承则是进一步将一类事物共有的属性和行为抽象成一个父类,而每一个子类是一个特殊的父类--有父类的行为和属性,也有自己特有的行为和属性。这样做扩展了已存在的代码块,进一步提高了代码的复用性。

如果说封装和继承是为了使代码重用,那么多态则是为了实现接口重用。多态的一大作用就是为了解耦--为了解除父子类继承的耦合度。如果说继承中父子类的关系式IS-A的关系,那么接口和实现类之之间的关系式HAS-A。简单来说,多态就是允许父类引用(或接口)指向子类(或实现类)对象。很多的设计模式都是基于面向对象的多态性设计的。

总结一下,如果说封装和继承是面向对象的基础,那么多态则是面向对象最精髓的理论。掌握多态必先了解接口,只有充分理解接口才能更好的应用多态。


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