首页 > 编程笔记 > PHP笔记 阅读:13

PHP类的定义和使用(非常详细)

类是面向对象中最为重要的概念之一,是面向对象设计中最基本的组成模块。可以将类简单地看作一种数据结构,在类中的数据和函数称为类的成员。

PHP类的定义

在PHP中,定义类的关键字是 class,定义格式如下:
<?php
权限修饰符  class类名{
类的内容;
}
?>
其中,权限修饰符是可选项,常见的修饰符包括 public、private 和 protected。创建类时,可以省略权限修饰符,此时默认的修饰符为public。

public、private 和 protected 的区别如下:
例如,定义一个 Student(学生)为公共类,代码如下:
public class Student
{
    //类的内容
}

1) 成员属性

成员属性是指在类中定义的变量。在类中可以定义多个变量,所以对象中可以存在多个成员属性,每个变量将存储不同的对象属性信息。

例如:
public class Student
{
    public $name;//类的成员属性
}
其中,成员属性必须使用关键词进行修饰,常见的关键词包括 public、protected 和 private。如果没有特定的意义,仍然需要用 var 关键词修饰。另外,在声明成员属性时可以不进行赋值操作。

2) 成员方法

成员方法是指在类中定义的函数。在类中可以定义多个函数,所以对象中可以存在多个成员方法。类的成员方法可以通过关键字进行修饰,从而控制成员方法的使用权限。

以下是定义成员方法的例子:
class Student
{
    public $name;       // 类的成员属性
    function GetIp()   
    {
                        // 方法的内容
    }
}

PHP类的实例化

面向对象编程的思想是一切皆为对象。类是对一个事物抽象出来的结果,因此,类是抽象的。对象是某类事物中具体的那个,因此,对象就是具体的。

例如,学生就是一个抽象概念,即学生类,但是姓名叫张三的学生就是学生类中一个具体的学生,即对象。

类和对象的关系可以描述为:类用来描述具有相同数据结构和特征的“一组对象”,“类”是“对象”的抽象,而“对象”是“类”的具体实例,即一个类中的对象具有相同的“型”,但其中每个对象却具有各不相同的“值”。

类是具有相同或相仿结构、操作和约束规则的对象组成的集合,而对象是某一类的具体化实例,每一个类都是具有某些共同性的对象的抽象。

类的实例化格式如下:
$变量名=new类名称([参数]);  //类的实例化
其中,new 为创建对象的关键字,$ 变量名返回对象的名称,用于引用类中的方法。参数是可选的,如果存在参数,就用于指定类的构造方法或用于初始化对象的值;如果没有定义构造函数参数,PHP 就会自动创建一个不带参数的默认构造函数。

如下面的例子所示:
class Student
{
    public $name;          // 类的成员属性
    function GetIp()       // 方法的内容
    {
        // 方法实现内容
    }
}

$lili = new 类名称();    // 类的实例化
$liufei = new 类名称(); // 类的实例化
$zhangming = new 类名称(); // 类的实例化
$wangyi = new 类名称();  // 类的实例化
上面的例子实例化了 4 个对象,并且这 4 个对象之间没有任何联系,只能说明它们源于同一个类。可见,一个类可以实例化多个对象,每个对象都是独立存在的。

访问类中的成员属性和方法

通过对象的引用可以访问类中的成员属性和方法,这里需要使用特殊的运算符号:“->”。具体的语法格式如下:
$变量名=new类名称();  //类的实例化
$变量名->成员属性=值;  //为成员属性赋值
$变量名->成员属性;     //直接获取成员的属性值
$变量名->成员方法;     //访问对象中指定的方法
另外,用户还可以使用一些特殊的访问方法。

1) $this

$this 存在于类的每一个成员方法中,是一个特殊的对象引用方法。成员方法属于哪个对象,$this 引用就代表哪个对象,专门用于完成对象内部成员之间的访问。

2) 操作符“::”

操作符“::”可以在没有任何声明实例的情况下访问类中的成员。使用的语法格式如下:
关键字:::变量名/常量名/方法名
其中,关键字主要包括 parent、self 和类名 3 种:
下面通过实例介绍类的声明和实例的生成:
<?php
// 定义类
class guests{
    private $name;
    private $gender;
    function setname($name) {
        $this->name = $name;
    }
    // 定义函数
    function getname() {
        return $this->name;
    }
    function setgender($gender) {
        $this->gender = $gender;
    }
    function getgender() {
        return $this->gender;
    }
};

$xiaoming = new guests;    // 生成实例
$xiaoming->setname("王小明");
$xiaoming->setgender("男");
$lili = new guests;
$lili->setname("李莉莉");
$lili->setgender("女");
echo $xiaoming->getname() . "\t" . $xiaoming->getgender() . "<br>";
echo $lili->getname() . "\t" . $lili->getgender();
?>
运行结果为:

王小明 男
李莉莉 女

分析程序:
1) 用 class 关键字声明一个类,而这个类的名称是 guests。在大括号内写入类的属性和方法。其中 private $name、private $gender 为类 guests 的自有属性,用 private 关键字声明,也就是说只有在类内部的方法可以访问它们,类外部是不能访问的。

2) function setname($name)、function getname()、function setgender($gender) 和 function getgender() 就是类方法,可以对 private $name、private $gender 这两个属性进行操作。$this 是对类本身的引用。用“->”连接类属性,格式如 $this->name 和 $this->gender。

3) 之后用 new 关键字生成一个对象,格式为 $object = new Classname;,对象名是 $xiaoming。当程序通过 new 生成一个类 guests 的实例,也就是对象 $xiaoming 的时候,对象 $xiaoming 就拥有了类 guests 的所有属性和方法。然后就可以通过“接口”,也就是这个对象的方法(也就是类的方法的副本)来对对象的属性进行操作。

4) 通过接口 setname($name) 给实例 $xiaoming 的属性 $name 赋值为 XiaoMing,通过 setgender($gender) 给实例 $xiaoming 的属性 $gender 赋值为 male。同样的道理,通过接口操作了实例 $lili 的属性。最后通过接口 getname()、getgender() 返回不同的两个实例的属性 $name 和 $gender,并且打印出来。

相关文章