PHP 面向对象详解

PHP 面向对象详解

什么是面向对象编程

面向对象编程 (OOP) 是一种编程范式,它将现实世界中的对象抽象为程序中的对象,并且对象间可以相互通信、相互协作,从而更好的解决复杂的编程问题。

面向对象编程的特点

  • 封装性:将对象的属性和方法封装在一个类中,不被外部所访问,只能通过类提供的接口来进行访问。

  • 继承性:子类能继承父类的属性和方法,并且能够在此基础上进行扩展和修改。

  • 多态性:同一个类的不同对象调用相同的方法,会有不同的实现结果。

面向对象编程的四大支柱

  1. 封装(Encapsulation):将数据和方法包装在一个类中,防止外部直接访问数据和方法,只能通过公开的或被保护的接口进行访问。

  2. 继承(Inheritance):子类可以继承父类的属性和方法,并且能够在此基础上进行扩展和修改,减少冗余代码。

  3. 多态(Polymorphism):同一个类的不同对象调用相同的方法,会有不同的实现结果,灵活性更高。

  4. 抽象类和接口(Abstraction):抽象类是一种特殊的类,不能直接实例化,只能被继承,其中可能包含有抽象方法,而接口只能包含有抽象方法,不能包含有属性和方法的实现,需要实现类来实现。

PHP 面向对象的基本使用方式

  1. 声明一个类

使用 class 关键字声明一个类,类名第一个字母一般大写。声明一个类可以包含有属性和方法。

class Person {
  public $name;
  public $age;

  public function sayHello() {
    echo "Hello, I am " . $this->name . ", " . $this->age . " years old";
  }
}
  1. 实例化一个对象

使用 new 关键字创建一个类的对象,可以通过 -> 访问对象的属性和方法。

$person = new Person();
$person->name = "Tom";
$person->age = 18;
$person->sayHello(); // 输出:Hello, I am Tom, 18 years old.

示例1:简单的计算器程序

下面是一个简单的计算器程序的示例代码。这里定义了一个 Calculator 类,包含 addsubtractmultiplydivide 四个方法来完成加减乘除的操作。

class Calculator {
  public function add($a, $b) {
    return $a + $b;
  }

  public function subtract($a, $b) {
    return $a - $b;
  }

  public function multiply($a, $b) {
    return $a * $b;
  }

  public function divide($a, $b) {
    if ($b == 0) {
      throw new Exception("Division by zero");
    } else {
      return $a / $b;
    }
  }
}

// 使用示例
$calculator = new Calculator();
echo $calculator->add(1, 2); // 输出:3
echo $calculator->subtract(4, 2); // 输出:2
echo $calculator->multiply(3, 5); // 输出:15
echo $calculator->divide(10, 5); // 输出:2
try {
  echo $calculator->divide(8, 0); // 抛出异常:Division by zero
} catch(Exception $e) {
  echo $e->getMessage();
}

示例2:商品购物车程序

下面是一个简单的商品购物车程序的示例代码。这里定义了一个 Product 类和 Cart 类,其中 Product 类表示一个商品,包含商品的名称、价格和库存等信息,Cart 类表示一个购物车,包含添加商品到购物车(addProduct)、删除购物车中的商品(removeProduct)和计算购物车中商品的总价值(calcTotalPrice)等方法。

class Product {
  public $name;
  public $price;
  public $stock;

  public function __construct($name, $price, $stock) {
    $this->name = $name;
    $this->price = $price;
    $this->stock = $stock;
  }
}

class Cart {
  private $products = [];

  public function addProduct($product, $num = 1) {
    if ($product->stock < $num) {
      throw new Exception("Stock not enough");
    }
    if (isset($this->products[$product->name])) {
      $this->products[$product->name]->num += $num;
    } else {
      $this->products[$product->name] = new stdClass();
      $this->products[$product->name]->product = $product;
      $this->products[$product->name]->num = $num;
    }
    $product->stock -= $num;
  }

  public function removeProduct($name, $num = 1) {
    if (!isset($this->products[$name])) {
      throw new Exception("Product not exist");
    }
    if ($this->products[$name]->num < $num) {
      throw new Exception("Product not enough");
    }
    $this->products[$name]->num -= $num;
    if ($this->products[$name]->num == 0) {
      unset($this->products[$name]);
    }
    $this->products[$name]->product->stock += $num;
  }

  public function calcTotalPrice() {
    $sum = 0;
    foreach ($this->products as $item) {
      $sum += $item->product->price * $item->num;
    }
    return $sum;
  }
}

// 使用示例
$cart = new Cart();
$product1 = new Product("iPhone12", 7999, 50);
$product2 = new Product("iPad Pro", 8999, 30);
$cart->addProduct($product1, 2);
$cart->addProduct($product2, 1);
echo $cart->calcTotalPrice(); // 输出:$24797
$cart->removeProduct("iPhone12", 1);
echo $cart->calcTotalPrice(); // 输出:$16798
try {
  $cart->addProduct($product2, 31); // 抛出异常:Stock not enough
} catch(Exception $e) {
  echo $e->getMessage();
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP 面向对象详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • php-使用imagejpeg保存和提供图像文件

    下面是关于“PHP 使用 imagejpeg 保存和提供图像文件”的完整攻略,包含两个示例说明。 简介 在 PHP 中,可以使用 imagejpeg 函数将图像保存为 JPEG 格式的文件,并使用 header 函数将其提供给客户端。在本文中,我们将介绍如何使用 imagejpeg 函数保存和提供图像文件。 步骤一:创建图像资源 在使用 imagejpeg …

    other 2023年5月8日
    00
  • HTML5新特性 多线程(Worker SharedWorker)

    HTML5引入了多线程的概念,允许在单个页面中使用多个线程执行JavaScript代码。其中,Worker和SharedWorker是两种用于实现多线程编程的JavaScript API,它们可以在后台线程中执行JavaScript代码,而不会阻塞页面的渲染和交互。本教程就为大家详细介绍HTML5的多线程新特性及Worker和SharedWorker的使用方…

    other 2023年6月27日
    00
  • JS中封装axios来管控api的2种方式

    在JS中,使用axios作为网络请求库是非常常见的。在实际应用中,我们需要封装axios来管理API,以便于维护和升级。这里介绍两种常见的封装axios的方式。 方式一:基于axios.create()方法 通过axios.create()方法创建一个新的axios实例,然后在这个实例中设置一些统一的请求头、请求拦截器和响应拦截器等。示例代码如下: impo…

    other 2023年6月25日
    00
  • 关于c++:在gcc中使用-o3是否有任何弊端?

    以下是关于“关于c++:在gcc中使用-o3是否有任何弊端?”的完整攻略,包含两个示例。 背景 在使用gcc编译C++时,我们可以使用-O3选项来启用最高级别的优化。这个选项可以显著提高程序的性能,但也可能会带来一些弊端。 弊端 使用-O3选项可能会带来以下弊端: 编译时间增加:启用最高级别的优化会增加编译时间,因为编译器需要进行更多优化分析和代码重组。 可…

    other 2023年5月9日
    00
  • scala中常用特殊符号详解

    Scala中常用特殊符号详解 在Scala中,有许多特殊符号常常被使用。如果你不熟悉这些符号,可能会导致你在阅读Scala代码时产生很大的困惑。因此,在本文中,我们将详细讲解Scala中常用特殊符号的含义和用法,帮助读者更好地理解和编写Scala代码。 箭头符号(→、=>) 在Scala中,箭头符号有两个含义。第一个符号是→,代表的是关联关系。我们可以…

    other 2023年6月26日
    00
  • C语言中你容易忽略的知识点与技巧总结

    C语言中容易忽略的知识点与技巧总结 C语言中容易忽略的知识点 宏定义和条件编译 宏定义是预处理器对代码的一种替换,可以用来定义某个常量或者函数 条件编译可以根据一些条件来选择性地编译代码,减少不必要的代码生成,提高代码执行效率 示例: #include <stdio.h> #define MAX 100 int main() { #ifdef W…

    other 2023年6月27日
    00
  • raid0、raid1、raid5、raid6、raid50、raid60组成特点

    以下是关于RAID 0、RAID 1、RAID 5、RAID 6、RAID 50、RAID 60的详细讲解,包括组成特点和两个示例。 RAID 0 RAID 0是一种条带化存储技术,将数据分成多个块,并将这些块分别存储在多个磁盘驱动器上。RAID 0的组成特点如下: 至少需要两个磁盘驱动器。 数据被分成块,并且每个块被写入不同的磁盘驱动器。 读取数据时,所有…

    other 2023年5月7日
    00
  • MySQL InnoDB 存储引擎的底层逻辑架构

    MySQL InnoDB 存储引擎的底层逻辑架构 MySQL InnoDB 存储引擎是 MySQL 数据库中最常用的存储引擎之一,它提供了高性能和可靠性的特性。下面将详细讲解 InnoDB 存储引擎的底层逻辑架构。 1. 概述 InnoDB 存储引擎是一个事务性存储引擎,它支持 ACID(原子性、一致性、隔离性和持久性)特性。它使用了多版本并发控制(MVCC…

    other 2023年8月2日
    00
合作推广
合作推广
分享本页
返回顶部