PHP 面向对象详解

yizhihongxing

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日

相关文章

  • ajax异步请求302分析

    Ajax异步请求302分析 在前端开发中,我们经常需要通过ajax异步请求数据,但有时候我们可能会遇到一些坑,如出现302重定向等问题,接下来我们就来分析一下ajax异步请求中可能出现的302问题。 什么是302? 302表示请求的资源已经临时转移到了另一个URI,这个URI可以在响应的Location字段中找到。我们可以理解为访问的网页已经被暂时移动到了其…

    其他 2023年3月28日
    00
  • 通过实例解析python创建进程常用方法

    通过实例解析python创建进程常用方法 在Python中,我们可以使用multiprocessing模块来创建进程。下面是两个常用的方法: 1.使用Process类创建进程 Process类是multiprocessing模块里提供的进程类,使用它可以较为方便地创建进程。创建一个进程,需要执行以下步骤: 1.导入Process类 from multipro…

    other 2023年6月27日
    00
  • 解决spring boot 配置文件后缀的一个坑

    以下是详细讲解“解决spring boot 配置文件后缀的一个坑”的完整攻略。 背景 在 Spring Boot 项目中,我们通常通过 application.properties 或 application.yml 配置文件来配置项目的属性。然而,在实际开发中,我们可能会遇到一个问题,即当我们的配置文件名称不符合默认规则时,Spring Boot 无法正确…

    other 2023年6月25日
    00
  • java获取当前目录方法整理

    Java获取当前目录方法整理 在Java中,获取当前目录是一项常见的任务。本文将介绍几种获取当前目录的方法,并提供两个示例说明。 方法一:System.getProperty() System.getProperty()方法可以获取当前工作目录。以下是一个示例: String currentDirectory = System.getProperty(&qu…

    other 2023年5月7日
    00
  • webpack常用配置项配置文件介绍

    下面是对”webpack常用配置项配置文件介绍”的详细讲解: 简介 Webpack是一个现代JavaScript应用程序的模块打包器,在实现代码的模块化管理方面表现卓越,而在实现代码生产上也拥有强大的优化能力。在使用Webpack时,最常用的就是对webpack配置文件进行配置,在此过程中,需要了解一些Webpack的常用配置项。 常用的配置项 以下是Web…

    other 2023年6月25日
    00
  • 修改服务器配置,让asp.net文件后缀名随心所欲

    修改服务器配置,让asp.net文件后缀名随心所欲 如果你想修改服务器配置,让ASP.NET文件的后缀名随心所欲,你可以按照以下步骤进行操作: 打开IIS管理器:首先,打开Internet Information Services (IIS)管理器。你可以在Windows操作系统中的“控制面板”或者通过运行命令inetmgr来打开IIS管理器。 找到你的网站…

    other 2023年8月5日
    00
  • python实现获取单向链表倒数第k个结点的值示例

    下面就是详细讲解“Python实现获取单向链表倒数第k个结点的值”的攻略。 问题描述 假设有一条单向链表,现在需要找到它的倒数第k个节点的值,应该如何实现呢? 解决思路 方法一:先遍历整个链表,获取链表长度n,然后在从头遍历到n-k个节点,即可获取倒数第k个节点。 方法二:使用快慢指针法,先让快指针走k-1个节点,然后同时走快慢指针,当快指针走到链表尾部时,…

    other 2023年6月27日
    00
  • 微信程序开发之-weixinjsbridge调用

    微信程序开发之-weixinjsbridge调用 在微信小程序开发中,weixinjsbridge是一个非常重要的工具,它可以让我们在小程序中调用微信原生API。本文将详细讲解如何使用weixinjsbridge调用微信的原生API。 weixinjsbridge简介 weixinbridge是微信小程序提的一个JavaScript库,它可以让我们在小程序中…

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