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日

相关文章

  • ios11正式版多大 更新升级iOS10正式版需要占用多大内存(附iOS11升级教程)

    iOS 11正式版更新升级攻略 1. iOS 11正式版的大小 iOS 11正式版的大小取决于设备型号和之前安装的iOS版本。以下是一些常见设备的iOS 11正式版大小范例: iPhone 7 Plus:大约1.9GB iPad Pro 9.7英寸:大约2.0GB 请注意,这些数字仅供参考,实际大小可能会有所不同。 2. 升级iOS 10正式版所需的内存空间…

    other 2023年8月1日
    00
  • golang 调用 php7详解及实例

    Golang调用PHP7详解及实例攻略 在本攻略中,我们将详细讲解如何使用Golang调用PHP7,并提供两个示例说明。 准备工作 在开始之前,请确保已经完成以下准备工作: 安装Golang:确保已经正确安装了Golang开发环境。你可以从Golang官方网站(https://golang.org)下载并安装最新版本的Golang。 安装PHP7:确保已经正…

    other 2023年7月29日
    00
  • Android Binder 通信原理图文详解

    我将为您详细讲解“Android Binder 通信原理图文详解”的完整攻略。 Android Binder 通信原理图文详解 什么是 Binder Binder是Android中用于 IPC(进程间通信)的机制,它是一个高效、低延迟、高并发的IPC机制。 Binder 通信的三个角色 Binder 通信的三个角色包括: Client : 发起 Binder…

    other 2023年6月27日
    00
  • simulink代码自动生成(一)

    Simulink代码自动生成(一) 近年来,随着自动驾驶、无人机等技术的发展,控制系统设计和实现的复杂性不断增加。Simulink作为知名的控制系统建模工具,可以协助工程师快速建立模型,并通过仿真测试来优化控制算法。但是,代码实现是模型落地的重要一步,手动编写代码不仅费时费力,容易出错,而且不便于维护。本文将介绍如何利用Simulink内置的功能,直接生成C…

    其他 2023年3月28日
    00
  • openwrtdns无法解析wan连接的内网服务器域名

    OpenWrt DNS无法解析WAN连接的内网服务器域名 如果你正在使用 OpenWrt 路由器,并且遇到了无法通过域名访问内网服务器的问题,本文将帮助你解决这个问题。如果你在 WAN 连接上的 IP 地址发生了变化,DNS 可能无法正确解析你的内网服务器的域名。在本文中,我们将讨论如何修复这个问题。 检查你的 DNS 配置 首先,请确认你的 DNS 配置是…

    其他 2023年3月29日
    00
  • 关于python:来自单个列表的pairs

    简介 在Python中,可以使用zip函数将两个列表中的元素一一对应组成新的列表。但是,如果我们想要从单个列表中创建一组对,可以使用列表解析或者生成器表式来实现。 步骤 下面是从单个列表中创建一组对的步骤: 使用列表解析或者生成器表达式来创建一组对。 将创建的一组对存储到一个新的列表中。 示例说明 下面是两个示例说明,分别演示了如何从单个列表中创建一组对。 …

    other 2023年5月8日
    00
  • angular中的observable问题

    Angular中的Observable问题 在Angular中,Observable是一种常用的异步编程工具,用于处理数据流和事件流。然而,对于初学者来说,可能会遇到一些与Observable相关的问题。本文将详细讲解一些常见的Observable问题,并提供两个示例说明。 问题1:订阅多个Observable时如何处理 当我们需要同时订阅多个Observa…

    other 2023年10月18日
    00
  • java字符串格式化详解

    以下是关于“Java字符串格式化详解”的完整攻略,包括字符串格式化的介绍、示例说明等。 字符串格式化介绍 Java中的字符串格式化是指将一个字符串中的占位符换为具体的值。占位符可以是任何类型的数据,包括整数、浮点数、字符串等。Java中常用的字符串格式化方法是使用String.format()方法。 示例说明 以下是两个使用字符串格式化的示例说明: 示例一 …

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