IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> php 类与对象 -> 正文阅读

[PHP知识库]php 类与对象

类与对象

通过定义类可以描述对象:

  • 将一系列特征相似的对象中的属性和方法抽象出来的一段特殊代码称为一个类
  • 类使用class关键字来进行定义,后面跟上类的名称

面向对象的三大特征

  1. 封装:是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体细节,这就是封装思想
  2. 继承性:主要描述的是类与类之间的关系,通过继承,可以无需重新编写原有类的情况下,对原有类的功能进行扩展
  3. 多态性:指的是同一操作作用于不同的对象,会产生不同的执行结果

1.类的定义格式:
class 类名{
类中的成员…
}

class Person //类名 {
          public $age; //这是一个成员变量
          public function speak(){
            echo "我是一个好人"
}// 这是一个成员方法
}

2.完成类的定义后,创建对象
对象名称 = new 类名();
3.类的封装
所谓类的封装是指在定义一个类时,将类中的属性私有化,使用private关键字来修饰
私有化的属性只能在它所在类中被访问,为了能让外界访问私有属性,PHP提供了两种访问形式

  • 通过getXxx(),setXxx方法访问私有属性
  • 通过_get(),_set()方法访问私有属性

在php程序中,为了可以访问私有属性,可以手动编写公有的getXxx() setXxx()方法
其中,getXxx()方法用于获取属性值,setXxx()方法用于设置属性值

<?php 
 class Person {
 	private $name; // 将$name属性封装
 	private $age;
 	// 定义_get()方法用于获取Person的属性
 	public function _get($property_name){
 		echo "自动调用_get()方法获取属性值<br>";
 		if (isset($this->$property_name)) {
 			return($this->$property_name);
 			# code...
 		}
 		else{
 			return(NULL);
 		}
 	}
 	// 定义一个_set()方法用于设置Person的属性
 	public function _set($property_name,$value){
 		echo "自动调用一个_set()方法为属性赋值<br>";
 		$this->$property_name=$value;
 	}
 }


$p1 =new Person();
$p1->name = "张华";
echo "姓名:".$p1->name."<br>";
$p1->age = 10;
echo "姓名:" .$p1->age."<br>";

?>

特殊的$this,用于完成
对象一旦被创建,在对象的每个成员方法中都会存在一个特殊的对象引用“”“$this”,它代表当前对象,用于完成对象内部成员之间的访问
$this->属性名

构造方法和析构方法
1.在每个类中,都有一个构造方法,在创建对象时会被自动调用
默认构造方法
如果在类中没有声明构造方法
PHP就会自动生成一个没有参数,且没有任何操作的默认构造方法
构造方法
修饰符 function _construct(参数列表){
// 初始化操作
}
构造方法名必须为 _construct()
修饰符可以省略,默认为public
创建新对象后,系统就会自动调用该类的构造方法,不需要手动调用

class TestClass{
  function _construct(){
  echo 'hello';
}
  }
  $obj = new TestClass();

析构方法
是PHP5中新添加的内容,它在对象销毁之前就会被自动调用,用于释放内存

function _destruct(){
// 清理操作}

需要注意的是,析构方法的名称必须为 _destruct(),且析构方法不带任何参数

PHP中有一种“垃圾回收”机制,自动清理不在使用的对象,以释放内存,析构方法会在此时被自动调用,只需明确析构方法在何时被调用的即可

类常量和静态成员
类常量
在类中,有些属性的值不能被改变,并且希望被所有对象共享
在定义时,需要用const关键字声明

<?php 
class MathTool{
	const PI = 3.1415926; // 定义一个类常量
	public function show(){
		echo MathTool::PI."<br>"; // 通过类名访问
	}
	public function display(){
		echo self::PI."<br>"; // 通过self关键字访问
	}
}
echo MathTool::PI."<br>"; // 在类外部直接访问
$obj = new MathTool(); // 实例化一个对象
$obj ->show();
$obj ->display();
?>

由于类常量PI是属于类本身而非对象的,因此需要使用范围解析操作符(::)来访问

  • 需要注意的是,在类中定义常量只能是基本数据类型的值,而且必须是一个定值,不能是变量,类属性,数字运算的结果或函数
  • 类常量一旦设置后设置后就不能改变,如果试图在程序中改变他的值,则会出现错误,且在声明变量时一定要赋初始值,因为后期没有其他方式为其赋值

静态成员
静态成员包括静态属性和静态方法

<?php 
class Student{
	// 定义show 方法,输出学校名称
	public static $SchoolName="传播"; // 静态方法
	public function show (){
		echo "我的学校是:".self::$SchoolName."<br>";
	}
}
$stu1= new Student();
$stu2= new Student();
echo "学生1:<br>";
$stu1->show();
echo "学生2:<br>";
$stu2->show();
//Student::show();
?>

静态属性访问方法

类名::属性
如果在类的内部,可以使用self代替类名

在静态方法中,不要使用$this,因为静态方法是属于类的
在静态方法中,一般只对静态属性进行操作

继承

  • 在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系

    在PHP中,类的继承是指一个现有类的基础上构建一个新的类,构建出来的新类被称作子类,现有类被称为父类,子类会自动拥有父类所有的可继承的属性和方法
    在程序中,声明一个类继承另一个类,需要使用extends关键字

<?php 
 // 定义Animal类
class Animal{
	public $name;
	public function shout(){
		echo "动物发出叫声<br>";
	}
}
// 定义Dog类继承自Animal类
class Dog extends Animal{
	public function printName(){
		echo "name=".$this->name;
	}
}
$dog=new Dog();
$dog->name="沙皮狗";
$dog->shout();
$dog->printName();
?>
  • 子类在继承父类的时候,会自动拥有父类的成员
  • 子类默认继承了父类所有声明为public及protected的成员属性和方法
  • 但是,不能继承声明为private的成员属性和方法
  • 子类中可以定义和父类同名的方法,此时子类中的方法会覆盖父类中的方法
  • 在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类方法的重写
  • 需要注意的是,在子类中重写的方法需要和父类中被重写的方法具有相同的方法名,参数
<?php 
 // 定义Animal类
class Animal{
	// 动物叫的方法
	public function shout(){
		echo "动物发出叫声<br>";
	}
}
// 定义Dog类继承自Animal类
class Dog extends Animal{
	// 定义狗叫的方法
	public function shout(){
		echo '汪汪........';
	}
	
}
$dog=new Dog();
$dog->shout();
?>

final关键字有“无法改变”或者最终的含义,因此被final修饰的类和成员方法不能被修改

抽象类和接口
抽象类和接口用于提高程序的灵活性,抽象类是一种特殊的类,而接口又是一种特殊的抽象类
定义抽象类需要使用abstract关键字类修饰

<?php 
 // 使用abstract关键字声明一个抽象类
abstract class Animal{
	// 在抽象类中声明抽象方法
	abstract public function shout();
}
// 定义Dog类继承自Animal类
class Dog extends Animal{
	// 实现抽象方法shout()
	public function shout(){
		echo '汪汪........<br>';
	}
	
}
// 定义Cat类继承自Animal类
class Cat extends Animal{
	// 实现抽象方法shout()
	public function shout(){
		echo '喵喵........<br>';
	}
	
}
$dog=new Dog();
$dog->shout();
$cat=new Cat();
$cat->shout();
?>
  • 抽象类不能被实例化
  • 抽象类可以没有抽象方法,但有方法的重写类才有意义,一旦包含了抽象方法,则这个类必须声明为abstract
  • 抽象类中可以有抽象方法,成员属性,常量
  • 抽象方法不能有函数体,它只能存在于抽象类中
  • 如果一个类继承了某个抽象类,则他必须实现该抽象类的所有抽象方法,除非它自己也声明为抽象类

接口
如果一个抽象类中所有方法都是抽象的,则可以将这个类以另一种方式来定义,即接口,关键字interface
定义一个接口与定义一个标准类类似,但其中定义的所有方法都是空的

  • 需要注意的是接口中所有方法都是公用的,也不是使用final关键字来修饰
<?php 
 // 定义Animal接口
interface  Animal{
	 public function run();
	 public function shout();
}
// 定义Dog类,实现了Animal接口
class Dog implements Animal{
	public function run(){
		echo "狗在奔跑<br>";
	}
	public function shout(){
		echo '汪汪........<br>';
	}
}
// 定义Cat类,实现了Animal接口
class Cat implements Animal{
		public function run(){
		echo "猫在奔跑<br>";
	}
	public function shout(){
		echo '喵喵........<br>';
	}
}
$dog=new Dog();
$dog->run();
$dog->shout();
$cat=new Cat();
$cat->run();
$cat->shout();
?>

多态
如:要实现一个动物叫的方法,由于每个动物的叫声是不同的,因此可以在方法中接收一个动物类型的对象参数

<?php 
 // 定义Animal接口
abstract class Animal{
	// 在抽象类中声明抽象方法
	abstract public function shout();
}
// 定义Dog类继承自Animal类
class Dog extends Animal{
	// 实现抽象方法shout()
	public function shout(){
		echo '汪汪........<br>';
	}
	
}
// 定义Cat类继承自Animal类
class Cat extends Animal{
	// 实现抽象方法shout()
	public function shout(){
		echo '喵喵........<br>';
	}
	
}
function AnimalShout($obj){
	// instanceof 用于确定一个PHP 变量是否属于某一类的class的实例
	// 使用方法:子类son instanceof 父类father
	if ($obj instanceof Animal) {
		$obj->shout();
	}else{
		echo "Error: 对象错误!";
	}
}
$dog=new Dog();
$cat=new Cat();
AnimalShout($cat);
AnimalShout($dog);
?>
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:03:36  更:2022-03-16 22:03:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:58:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码