08 PHP面向对象的高级操作

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 路老师分享PHP语言知识,帮助大家入门并深入了解PHP。内容涵盖构造方法、析构方法、继承、多态、`$this->`与`::`操作符的使用,以及数据隐藏等核心概念。通过详细示例,讲解如何在实际开发中运用这些技术。适合初学者和进阶开发者学习。

~~~~ 有胆量你就来跟着路老师卷起来! -- 纯干货,技术知识分享 ~~~~

路老师给大家分享PHP语言的知识了,旨在想让大家入门PHP,并深入了解PHP语言。


image.gif 编辑

1 构造方法和析构方法

1.1 构造方法

当一个类实例化一个对象时,可能会随着对象初始化一些成员变量,构造方法就是在创建对象的时候初始化对象参数的方法。

<?php 
   class SportObject{ //定义运动类
    public $name;
    public $height;
    public $weight;
    public $age;
    public $sex;
   
    // 构造方法
    public function __construct($name,$height,$weight,$age,$sex){
        $this->name = $name;
        $this->height = $height;
        $this->weight = $weight;
        $this->age = $age;
        $this->sex = $sex;
    }
    public function playBasketball(){
        echo "姓名:".$this->name."<br>身高:".$this->height.
        "<br>体重:".$this->weight."<br>年龄:".$this->age.
        "<br>性别:".$this->sex;
    }
 }
 //创建实例的时候并初始化对象参数
 $sport = new SportObject('龙傲天','188','80','30岁','男');
 //方法调用采用 对象->方法
 echo $sport->playBasketball();
?>

image.gif

image.gif 编辑

1.2 析构方法

析构方法的作用和构造方法正好相反,是在对象被销毁时调用,作用是释放内存。

<?php 
   class SportObject{ //定义运动类
    public $name;
    public $height;
    public $weight;
    public $age;
    public $sex;
   
    /***
     * 构造方法
     */
    public function __construct($name,$height,$weight,$age,$sex){
        echo "<p style='color:green;'><b>对象创建时初始化参数,调用的是构造方法!</b></p>";
        $this->name = $name;
        $this->height = $height;
        $this->weight = $weight;
        $this->age = $age;
        $this->sex = $sex;
    }
    public function playBasketball(){
        echo "姓名:".$this->name."<br>身高:".$this->height.
        "<br>体重:".$this->weight."<br>年龄:".$this->age.
        "<br>性别:".$this->sex;
    }
    /***
     * 析构方法
     */
    public function __destruct(){
        echo "<p style='color:red;'><b>对象被销毁,调用的是析构方法!</b></p>";
    }
 }
 //创建实例的时候并初始化对象参数
 $sport = new SportObject('龙傲天','188','80','30岁','男');
 //方法调用采用 对象->方法
 echo $sport->playBasketball();
?>

image.gif

image.gif 编辑

注意:PHP使用的是一种“垃圾回收”机制,自动清除不在使用的对象,释放内存。也就是说即使不使用unset()函数,析构方法也会自动被调用,这里只是明确一下析构方法在何时被调用。一般情况下不需要手动创建析构方法。

2 继承和多态

2.1 继承

一句话解释:就是子类可以继承父类所有成员变量和方法,包括构造方法。

当子类被创建时,PHP会先在子类中查找构造方法,如果子类有自己的构造方法,PHP会先调用子类中的方法,当子类中没有构造方法,PHP会调用父类中的构造方法,这就是继承。

/**
 * 继承语法
 *
 */
class subClass extends superClass{
   //类体
}

image.gif

设计一个运动父类,两个子类打篮球和举重类:

<?php 
   class SportObject{ //定义运动类
    public $name;
    public $height;
    public $weight;
    public $age;
    public $sex;
   
    /***
     * 构造方法
     */
    public function __construct($name,$height,$weight,$age,$sex){
        echo "<p style='color:green;'><b>对象创建时初始化参数,调用的是构造方法!</b></p>";
        $this->name = $name;
        $this->height = $height;
        $this->weight = $weight;
        $this->age = $age;
        $this->sex = $sex;
    }
    public function showMe(){
        echo "姓名:".$this->name."<br>身高:".$this->height.
        "<br>体重:".$this->weight."<br>年龄:".$this->age.
        "<br>性别:".$this->sex;
    }
  }
  class PlayBasketBall extends SportObject{
    public $height;
    function __construct($name,$height){
        $this->height=$height;
        $this->name=$name;
    }
    function showMe(){
        return "子类PlayBasketBall的用户名:".$this->name.
        "子类PlayBasketBall的身高:".$this->height;
    }
  }
  class WeightLifting extends SportObject{
    public $height;
    function __construct($name,$height){
        $this->height=$height;
        $this->name=$name;
    }
    function showMe(){
        return "子类WeightLifting的用户名:".$this->name.
        "子类WeightLifting的身高:".$this->height;
    }
  }
  /**
   * 继承测试
   */
  $playBasketBall = new PlayBasketBall('路老师','190');
  $weightLifting = new WeightLifting('路TT','180');
  echo $playBasketBall->showMe()."<br>";
  echo $weightLifting->showMe()."<br>";
?>

image.gif

image.gif 编辑

2.2 多态

多态好比有一个成员方法让大家去游泳,这个时候有的人带游泳圈,有的人拿浮板,有的人什么也不带,纯粹喝水。虽然是同一个方法,但是产生了不同的形态,这就是多态。

比如一个汽车抽象类Car,它有一个获取速度的成员方法getSpeed()。现在有3个汽车品牌的子类,分别继承Car父类,并且都有一个获取速度的成员方法getSpeed()。三个不同子类,调用同一个方法产生三种不同的形态:

<?php 
   /***
    * 定义抽象类Car
    */
    abstract class Car{ 
    abstract function getSpeed();
  }
  class Toyota extends Car{
    function getSpeed(){
        return "Toyota speed";
    }
  }
  class Nissan extends Car{
    function getSpeed(){
        return "Nissan speed";
    }
  }
  class Tesla extends Car{
    function getSpeed(){
        return "Tesla speed";
    }
  }
  /**
   * 继承测试
   */
  $car = new Toyota();
  $speed = $car->getSpeed();
  echo $speed;
?>

image.gif

image.gif 编辑

3 "$this->" 和 "::" 的使用

3.1 $this->

都知道,定义类的时候,你根本就不知道对象的名称是什么,这时如果想调用类中的方法,就要用伪变量"$this->"。"$this"意思就是本身,所以"$this->"只可以在类的内部使用。

<?php 
   /***
    * 定义抽象类Car
    */
    class Car{
        function test(){
            if(isset($this)){
                echo '$this的值为:'.get_class($this);
            } else {
                echo '$this未定义';
            }
        }
    }
    $class_name = new Car();
    $class_name->test();
   
?>

image.gif

image.gif 编辑

备注:get_class()函数返回对象所属类的名字,如果不是对象,返回false。

3.2 操作符 "::"

相对于伪变量$this只能在类的内部使用,操作符"::"更为强大,可以在没有声明任何实例的情况下访问类中的成员方法或成员变量。使用"::"操作符的通用格式为:

关键字::变量名/常量名/方法名

这里的关键字分为以下三种情况:

  • parent关键字:可以调用父类中的成员变量、成员方法和常量。
  • self关键字:可以调用当前类中的静态成员和常量。
  • 类名:可以调用本类中的变量、常量和方法。

下例子依次使用类名、parent关键字和self关键字来调用变量和方法。

<?php 
   /***
    * 定义抽象类Book
    */
    class Book{
        const NAME= 'computer';//定义常量NAME
        /**
         * 定义构造方法
         */
        function __construct(){
            echo "本年度图书类冠军为:".Book::NAME."<br>";
        }
    }
    class BookRank extends Book{
        const NAME = 'foreign language';
        function __construct(){
            parent::__construct();
            echo '本月图书类冠军为:'.self::NAME.'';
        }
    }
    $obj = new BookRank();
?>

image.gif

image.gif 编辑

4 数据隐藏

4.1 三类访问权限关键字

面向对象编程的特点之一是封装性,即数据隐藏。此时就涉及了数据的访问权限,访问权限对应的关键字有三类:

名字 介绍 权限范围
public 公共成员 可以在程序中的任何位置被其他的类和对象调用,子类也可以继承和使用父类中所有的公共成员。
private 私有成员 只能在所属类的内部调用和修改,不可以在类外被访问,子类中也不可以。
protected 保护成员 仅自己和子类能够调用自己的变量和方法。

注意:对于成员方法,如果没有写关键字,那么默认就是public,建议以后写程序的时候都要带上关键字,这是一种良好的编程习惯。

4.2 静态变量(方法)

可以通过给变量(方法)添加static关键字来直接调用。调用静态成员的格式为:

关键字::静态成员

关键字可以是self,以及所在的类名。

<?php 
  class Book{
    static $bookNum = 0;//定义静态变量
  }
?>

image.gif

下篇文章 php对象的高级及应用。

相关文章
|
4月前
|
PHP
PHP编程中的面向对象和面向过程
【8月更文挑战第28天】在PHP编程中,我们可以选择面向对象或面向过程的编程方式。面向对象的编程方式更符合人类习惯,易于理解,提高程序的重用性,减少代码出错率;而面向过程的编程方式则强调的是功能行为,以具体的功能实现为主。
|
4月前
|
设计模式 数据库连接 PHP
PHP编程中的面向对象与设计模式
在PHP编程世界中,掌握面向对象编程(OOP)和设计模式是提升代码质量和开发效率的关键。本文将深入浅出地介绍如何在PHP中应用OOP原则和设计模式,以及这些实践如何影响项目架构和维护性。通过实际案例,我们将探索如何利用这些概念来构建更健壮、可扩展的应用程序。
|
4月前
|
设计模式 测试技术 PHP
使用PHP进行面向对象网站开发的最佳实践
【8月更文第10天】PHP 是一种广泛使用的开源服务器端脚本语言,特别适合于 Web 开发并可嵌入 HTML 中。随着 PHP 5.x 和 7.x 版本的发展,它已经完全支持面向对象编程(OOP)。面向对象的设计模式和原则可以帮助开发者构建更加模块化、可扩展且易于维护的应用程序。
50 6
|
19天前
|
存储 PHP
09 PHP高级面向对象,大多数人不了解的东西!
路老师分享了PHP语言的高级应用,包括final关键字、抽象类、接口使用、对象类型检测及魔术方法等。通过实例详细讲解了PHP面向对象编程的核心概念和技术要点,帮助读者深入理解和掌握PHP。
24 3
|
19天前
|
PHP
07 PHP的面向对象你真的了解吗?
路老师分享PHP语言知识,帮助大家入门并深入了解PHP。本文介绍了面向对象编程的基础概念,包括类、对象、封装性、继承性和多态性,以及类的定义、方法、实例化和成员变量等内容。下篇将讲解构造函数、析构函数及PHP对象的高级应用。
23 2
|
3月前
|
Java PHP 数据安全/隐私保护
PHP 面向对象,构造函数,析构函数,继承,方法的重写,接口抽象类,static,final,this,parent,self的异同和作用
本文详细介绍了PHP面向对象编程的一系列核心概念和用法,包括构造函数、析构函数、继承、方法重写、访问控制、接口、抽象类、静态成员、final关键字、以及this、self、parent这三个关键字的异同和作用。通过具体示例代码,展示了如何在PHP中使用这些面向对象的特性,以及它们在实际开发中的应用。
PHP 面向对象,构造函数,析构函数,继承,方法的重写,接口抽象类,static,final,this,parent,self的异同和作用
|
2月前
|
PHP 开发者
PHP编程中的面向对象基础
【9月更文挑战第36天】在PHP的世界中,面向对象编程(OOP)是一块基石。它不仅为代码带来了结构、可维护性与重用性,还让复杂的问题变得简单化。通过掌握类与对象、继承与多态等核心概念,开发者可以构建出更加强大和灵活的应用。本文将引导你理解这些概念,并通过实例展示如何在PHP中应用它们,让你轻松驾驭OOP的力量。
|
3月前
|
PHP 开发者
PHP编程中的面向对象基础与实践
【9月更文挑战第27天】在PHP的海洋里,面向对象编程(OOP)是一艘强大的船,它不仅能让代码组织得更加优雅,还能提高开发效率。本文将带你领略OOP的魅力,从基础概念到实际应用,让你轻松驾驭这艘船,开启高效编程之旅。
|
3月前
|
数据库连接 PHP 开发者
PHP编程中面向对象与面向过程的比较
【9月更文挑战第19天】本文旨在探讨PHP编程语言中的两种主要编程范式:面向对象编程(OOP)和面向过程编程。我们将通过对比这两种方法的特点、使用场景及其优缺点,帮助读者更好地理解在PHP开发中如何选择合适的编程模式。文章还将提供一些实际代码示例,以便更直观地展示两种编程方式的差异。
|
3月前
|
存储 PHP 开发者
PHP编程中的面向对象基础
【9月更文挑战第26天】在PHP的编程世界中,掌握面向对象的编程思维是提升代码质量和开发效率的关键。本文将带你走进PHP的对象世界,探索类和对象的概念、属性和方法的应用,以及继承和多态性的强大功能。通过深入浅出的讲解和实际代码示例,让你轻松理解并运用这些概念,为你的PHP编程之旅增添翅膀。