文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

PHP面向对象02:面向对象高级

2023-09-01 07:15

关注

PHP面向对象02:面向对象高级

一、设计模式

1. 单例模式

class Singleton{    private static $obj = null;    private function __construct() {    }    private function __clone() {    }    public static function getInstance() {        if (!(self::$obj instanceof self)) {            self::$obj = new self();        }        return self::$obj;    }}

2. 工厂模式

class Man{    public function display() {        echo "这是男人";    }}class Woman{    public function display() {        echo "这是女人";    }}// 工厂类class HumanFactory{    public static function getInstance($classname) {        switch ($classname) {            case 'w':                return new Woman();            case 'm':                return new Man();            default:                return null;        }    }}$woman = HumanFactory::getInstance('w');$man = HumanFactory::getInstance('m');$woman->display();  // 这是女人$man->display();  // 这是男人

二、面向对象三大特性

1. 封装

2. 继承

3. 多态

三、继承

1. 实现继承

class Human {    public function eat() {        echo "eat";    }}class Man extends Human {}$man = new Man();$man->eat();

2. 有限继承

a. 属性都能继承

在这里插入图片描述

b. 公有方法

在这里插入图片描述

c. 受保护的方法

外部访问不了,只能在类内部访问

在这里插入图片描述

d. 静态成员

在这里插入图片描述

3. 重写

class Human{    public $name = "Human";    public function show(){        echo __CLASS__;    }}class Man extends Human {    public $name = "Man";    public function show() {        echo __CLASS__ . "HelloWorld";    }}$man = new Man();echo $man->name;  // Man$man->show();  // ManHelloWorld
class Human{    public function show(){        echo __CLASS__;    }}class Man extends Human {    public function show() {        parent::show();        echo __CLASS__ . "HelloWorld";    }}

4. PHP继承特点

  1. PHP只能单继承。如果想要继承多个类,使用链式继承。
  2. 继承只有私有方法不能被继承。
  3. 允许子类继承父类的构造方法和析构方法。

5. 静态延迟绑定

class Human{    public static $name = 'Human';    public static function getName() {    // 静态绑定        echo self::$name."
"
; // Man访问,依旧输出Human的name // 静态延迟绑定 echo static::$name . "
"
; // Man访问,输出Man里面的name }}class Man extends Human{// 重写静态成员 public static $name = 'Man';}Man::getName();

6. 最终类和最终方法

class Man{    // 最终方法    final public function getName(){        echo __CLASS__;    }}// 最终类final class Boy extends Man{}

7. 抽象类和抽象方法

// 抽象类abstract class Human{    // 抽象方法    abstract public function eat();    // 普通方法    public function drink(){        echo "喝水";    }}// 抽象类只能被继承class Man extends Human{    // 实现抽象方法    public function eat() {}}

四、接口

interface Human {    // 接口中只能存在接口常量和抽象方法    const NAME = "人";    // 默认是抽象方法    public function eat();}// 实现接口class Man implements Human{    // 实现方法    public function eat() {}}
interface Human {}interface Animal{}interface Dog extends Animal{}interface Ape extends Human,Animal{}
# 定义接口interface Human {    const NAME = "人";    public function eat();}# 抽象类实现接口abstract class Woman implements Human {    abstract public function drink();}# 普通类继承抽象类,必须实现所有抽象方法。class Girl extends Woman {    public function eat() {        echo "吃饭";    }    public function drink() {        echo "喝水";    }}

五、代码复用

1. trait 基本使用

trait Eat{    public $time = 100;    public function showtime(){        echo $this->time;    }}class Man{    // 引入trait公共代码    use Eat;}// 可以直接使用$man = new Man();$man->showtime();

2. 同时使用多个 trait

trait Eat{    ...}trait Sleep{    ...}class Man{    use Eat, Sleep;}
trait Eat{    public function show(){        echo "吃饭";    }}trait Sleep{    public function show(){        echo "睡觉";    }}class Man{    use Eat, Sleep{        // 明确使用Eat里面的show方法        Eat::show insteadof Sleep;        // Sleep的show方法改名为shows        Sleep::show as shows;    }}$man = new Man();$man->show();$man->shows();
trait Eat{    public function show(){        echo "吃饭";    }}class Human{    public function show(){        echo "人";    }}class Woman extends Human{    use Eat;}$woman = new Woman();$woman->show();  // 吃饭

3. trait 其他用法

trait Drink{    private function show(){        echo "喝水";    }}class Girl{    use Drink{    # 修改访问控制权        show as public eshow;    }}$girl = new Girl();$girl->eshow();   // 喝水

六、PHP重载

1. 属性重载

方法名说明
__get($key)读属性时触发
__set($key, $value)写属性时触发
__isset($key)外部调用isset函数或empty函数时触发
__unset($key)外部调用unset函数删除对象属性时触发
__toString()对象被当成普通变量输出或连接时触发
class Human{    private $age = 10;    // 读取控制    public function __get($name) {        echo $name . '----' . __METHOD__;        $allow = array('age');        if (in_array($name, $allow)) {            return $this->$name;        }        return false;    }    public function __set($name, $value) {        echo $name . ":" . $value . "----" . __METHOD__;    }    public function __isset($name) {        echo $name . '----' . __METHOD__;    }    public function __unset($name) {        echo $name . '----' . __METHOD__;    }    public function __toString() {        echo '----' . __METHOD__;        return "123";    }}

2. 方法重载

方法名说明
__call($function_name[,$args])对象调用不可调用方法时触发
__callStatic($function_name[,$args])类访问不可调用静态方法时触发
class Man {    private function show() {}    private static function show2() {}    // 方法重载    public function __call($name, $arguments) {        // 允许访问的方法        $allow = array('show');        if (in_array($name, $allow)) return $this->$name($arguments);        return false;    }    public static function __callStatic($name, $arguments) {        // 不允许访问        return false;    }}

七、对象遍历

来源地址:https://blog.csdn.net/realoser/article/details/129120184

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯