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。简单来说,多态就是允许父类引用(或接口)指向子类(或实现类)对象。很多的设计模式都是基于面向对象的多态性设计的。
总结一下,如果说封装和继承是面向对象的基础,那么多态则是面向对象最精髓的理论。掌握多态必先了解接口,只有充分理解接口才能更好的应用多态。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号