类与对象
通过定义类可以描述对象:
- 将一系列特征相似的对象中的属性和方法抽象出来的一段特殊代码称为一个类
- 类使用class关键字来进行定义,后面跟上类的名称
面向对象的三大特征
- 封装:是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体细节,这就是封装思想
- 继承性:主要描述的是类与类之间的关系,通过继承,可以无需重新编写原有类的情况下,对原有类的功能进行扩展
- 多态性:指的是同一操作作用于不同的对象,会产生不同的执行结果
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;
private $age;
public function _get($property_name){
echo "自动调用_get()方法获取属性值<br>";
if (isset($this->$property_name)) {
return($this->$property_name);
}
else{
return(NULL);
}
}
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>";
}
}
echo MathTool::PI."<br>";
$obj = new MathTool();
$obj ->show();
$obj ->display();
?>
由于类常量PI是属于类本身而非对象的,因此需要使用范围解析操作符(::)来访问
- 需要注意的是,在类中定义常量只能是基本数据类型的值,而且必须是一个定值,不能是变量,类属性,数字运算的结果或函数
- 类常量一旦设置后设置后就不能改变,如果试图在程序中改变他的值,则会出现错误,且在声明变量时一定要赋初始值,因为后期没有其他方式为其赋值
静态成员 静态成员包括静态属性和静态方法
<?php
class Student{
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();
?>
静态属性访问方法
类名::属性 如果在类的内部,可以使用self代替类名
在静态方法中,不要使用$this,因为静态方法是属于类的 在静态方法中,一般只对静态属性进行操作
继承
<?php
class Animal{
public $name;
public function shout(){
echo "动物发出叫声<br>";
}
}
class Dog extends Animal{
public function printName(){
echo "name=".$this->name;
}
}
$dog=new Dog();
$dog->name="沙皮狗";
$dog->shout();
$dog->printName();
?>
- 子类在继承父类的时候,会自动拥有父类的成员
- 子类默认继承了父类所有声明为public及protected的成员属性和方法
- 但是,不能继承声明为private的成员属性和方法
- 子类中可以定义和父类同名的方法,此时子类中的方法会覆盖父类中的方法
- 在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类方法的重写
- 需要注意的是,在子类中重写的方法需要和父类中被重写的方法具有相同的方法名,参数
<?php
class Animal{
public function shout(){
echo "动物发出叫声<br>";
}
}
class Dog extends Animal{
public function shout(){
echo '汪汪........';
}
}
$dog=new Dog();
$dog->shout();
?>
final关键字有“无法改变”或者最终的含义,因此被final修饰的类和成员方法不能被修改
抽象类和接口 抽象类和接口用于提高程序的灵活性,抽象类是一种特殊的类,而接口又是一种特殊的抽象类 定义抽象类需要使用abstract关键字类修饰
<?php
abstract class Animal{
abstract public function shout();
}
class Dog extends Animal{
public function shout(){
echo '汪汪........<br>';
}
}
class Cat extends Animal{
public function shout(){
echo '喵喵........<br>';
}
}
$dog=new Dog();
$dog->shout();
$cat=new Cat();
$cat->shout();
?>
- 抽象类不能被实例化
- 抽象类可以没有抽象方法,但有方法的重写类才有意义,一旦包含了抽象方法,则这个类必须声明为abstract
- 抽象类中可以有抽象方法,成员属性,常量
- 抽象方法不能有函数体,它只能存在于抽象类中
- 如果一个类继承了某个抽象类,则他必须实现该抽象类的所有抽象方法,除非它自己也声明为抽象类
接口 如果一个抽象类中所有方法都是抽象的,则可以将这个类以另一种方式来定义,即接口,关键字interface 定义一个接口与定义一个标准类类似,但其中定义的所有方法都是空的
- 需要注意的是接口中所有方法都是公用的,也不是使用final关键字来修饰
<?php
interface Animal{
public function run();
public function shout();
}
class Dog implements Animal{
public function run(){
echo "狗在奔跑<br>";
}
public function shout(){
echo '汪汪........<br>';
}
}
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
abstract class Animal{
abstract public function shout();
}
class Dog extends Animal{
public function shout(){
echo '汪汪........<br>';
}
}
class Cat extends Animal{
public function shout(){
echo '喵喵........<br>';
}
}
function AnimalShout($obj){
if ($obj instanceof Animal) {
$obj->shout();
}else{
echo "Error: 对象错误!";
}
}
$dog=new Dog();
$cat=new Cat();
AnimalShout($cat);
AnimalShout($dog);
?>
|