💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] 本节介绍面向对象编程的主要概述,并探索这些概念之间如何交互;第3章将深入讨论这些概念在PHP6中的实现细节。本间涵盖了以下主题: * 类(Class) * 对象(Object) * 继承(Inheritance) * 多态(Polymorphism) * 接口(Interface) * 封装(Encapsulation) # 1.3 类 类是一个代码单元(由变量和函数组成),该代码单元描述了集合中所有成员的特征和行为。 ## 1.3.1 对象 类可以看成是构造对象的蓝本。 类永远不能有导发值 或状态,只有对象才可以值或状态。 在实例化,就可以将对象用于实现应用程序的业务需求。 ### 1. 创建类 ``` <?php class Demo{ } ``` 实例化一个对象 ``` <?php require_once('class.Demo.php'); $objDemo = new Demo(); ``` ### 2.添加方法 ``` <?php class Demo{ function sayHello($name){ print "Hello $name"; } } ``` 使用 `->` 来访问新创建的函数: ``` <?php require_once('class.Demo.php'); $objDemo = new Demo(); $objDemo->sayHello('Steve'); ``` >PHP在其OO语法中根本不使用点操作(.) ### 3.添加属性 在面向过程代码中,当希望存储某个值 时,会将该值赋给一个`变量`。 在OOP中,当希望存储某个属性的值时,也可以使用一个`变量`。 该变量在类声明的顶部声明,`类声明位于包含类代码的大括号中`。 变量的名称就是属性的名称! 声明使用`public $property`,使用`$obj->property`来访问。 ``` <?php class Demo{ public $name; function sayHello(){ print "Hello $this->name!"; } } ``` 使用 ``` <?php require_once('class.Demo.php'); $objDemo = new Demo(); $objDemo->name='Steve'; $objAnotherDemo = new Demo(); $objAnotherDemo->name='Ed'; $objDemo->sayHello(); $objAnotherDemo->sayHello(); ``` 访问该文件,字符串`Hello Steve!Hello Ed!`就出现在屏幕上! ### 4.保护对成员变量的访问 正如前面的示例所示,可以将 name 属性的值设置为任意所需要的数据——包括对象、整数数组、文件句柄或任何其他没有意义的值 。但是,并不能在设置name属性时执行任何形式的数据验证或更新其他的值 。 为了解决该问题,必须以 `get[property name]` 和 `set[property name]`的函数形式来实现属性。这些函数称为`存储器方法`,下面的示例演示了这些方法。 ``` <?php class Demo{ private $_name; public function sayHello(){ print "Hello ".$this->getName()."!"; } public function getName(){ return $this->_name; } public function setName($name){ if(!is_string($name) || strlen($name) == 0){ throw new Exception("Invalid name value!"); } $this->_name = $name; } } ``` 使用类 ``` <?php require_once('class.Demo.php'); $objDemo = new Demo(); $objDemo->setName('Steve'); $objDemo->sayHello(); $objDemo->setName(37); //would trigger an error ``` >name属性的成员访问级别已经由 public 变成了 private。下划线是建议的命名约定! ### 5. 初始化对象 对于许多将要创建的类,需要在初次实例化该类的对象时执行一些特殊的设置。例如,可能需要从数据库中获取某些信息,或者是初始化某些属性值 。通过创建一个`构造函数`的特殊方法可以执行实例化对象所需要的任何活动,该方法在PHP中是通过名为`_construct()`的函数来实现的。在实例化对象是时,PHP将自动调用这个特殊的函数。 ### 6.销毁对象 当请求的页面已经完成运行,或者创建的对象变量已经不在其作用域内,又或者变量被显式地设置为 null 时,都需要从内存中移除该变量。 在PHP6中,可以在销毁对象之前做一些处理工作,并且在销毁发生时采取相应的操作。 为了实现这一点,创建一个不带参数的、名为`__destruct`的函数。在销毁对象之前就会自动调用该函数,前提是该函数存在! ## 1.3.2 继承 利用继承机制, 我们可以定义一个基类! ### 1. 重写方法 重新写方法以覆盖方法 ### 2. 保留父类的功能 可以采用 `parent::[function name]` 这一关键字! 如: ``` parent::__contruct($customerID); ``` ### 3. 继承的工作原理 书中采用 `某一个变量的true和false` 的形式,以继承不同的类! ## 1.3.3 接口 ### 1. 接口的功能 接口可以指定某个对象能够执行某种函数,但是它并不需要表明如何执行该函数。 接口是不相关的对象之间为了执行共有的函数而建立 起来的合同。 ### 2. 接口的工作原理 书中用实例来表示,有意者可看 25、26页。 ## 1.3.4 封装 书中讲的其实就是业务的一些封装!