PHP 面向对象详解
什么是面向对象编程
面向对象编程 (OOP) 是一种编程范式,它将现实世界中的对象抽象为程序中的对象,并且对象间可以相互通信、相互协作,从而更好的解决复杂的编程问题。
面向对象编程的特点
-
封装性:将对象的属性和方法封装在一个类中,不被外部所访问,只能通过类提供的接口来进行访问。
-
继承性:子类能继承父类的属性和方法,并且能够在此基础上进行扩展和修改。
-
多态性:同一个类的不同对象调用相同的方法,会有不同的实现结果。
面向对象编程的四大支柱
-
封装(Encapsulation):将数据和方法包装在一个类中,防止外部直接访问数据和方法,只能通过公开的或被保护的接口进行访问。
-
继承(Inheritance):子类可以继承父类的属性和方法,并且能够在此基础上进行扩展和修改,减少冗余代码。
-
多态(Polymorphism):同一个类的不同对象调用相同的方法,会有不同的实现结果,灵活性更高。
-
抽象类和接口(Abstraction):抽象类是一种特殊的类,不能直接实例化,只能被继承,其中可能包含有抽象方法,而接口只能包含有抽象方法,不能包含有属性和方法的实现,需要实现类来实现。
PHP 面向对象的基本使用方式
- 声明一个类
使用 class
关键字声明一个类,类名第一个字母一般大写。声明一个类可以包含有属性和方法。
class Person {
public $name;
public $age;
public function sayHello() {
echo "Hello, I am " . $this->name . ", " . $this->age . " years old";
}
}
- 实例化一个对象
使用 new
关键字创建一个类的对象,可以通过 ->
访问对象的属性和方法。
$person = new Person();
$person->name = "Tom";
$person->age = 18;
$person->sayHello(); // 输出:Hello, I am Tom, 18 years old.
示例1:简单的计算器程序
下面是一个简单的计算器程序的示例代码。这里定义了一个 Calculator
类,包含 add
、subtract
、multiply
和 divide
四个方法来完成加减乘除的操作。
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技术站