您的位置:

PHP面向对象编程入门

一、OOP的基本概念

面向对象编程(Object-Oriented Programming, OOP)是一种程序设计方法,它的核心思想是将现实世界中的事物抽象成一个个对象,每个对象具有特定的属性和方法,通过这些属性和方法来描述对象在现实世界中的行为和状态。在PHP中,也可以使用面向对象的方法进行编程。

在OOP中,对象是指一个具体的东西,比如一个人、一只狗或者一辆汽车。在不同的对象中,它们都有自己的特征(属性)和行为(方法)。比如,人有姓名、性别、年龄等属性,同时会有吃饭、睡觉、打游戏等行为。在程序设计中,我们可以将一个对象看做一个类的实例。类(Class)是一种自定义类型,用于描述具有相同属性和方法的对象。

下面是一个简单的PHP类,用于描述一个人的姓名、性别和年龄:

class Person {
    public $name;
    public $age;
    public $gender;
}

在这个类中,我们定义了三个属性:$name、$age和$gender。这些属性都是public(公有)的,表示它们可以从类的外部访问。接下来,我们可以创建一个Person对象,并设置它的属性:

$person = new Person();
$person->name = 'Jack';
$person->age = 20;
$person->gender = 'male';

在这个例子中,我们首先创建了一个名为$person的Person对象。接着,我们通过“->”操作符来访问类中的属性,并将它们设置为‘Jack’、20和‘male’。

二、类的方法

类不仅可以拥有属性,也可以拥有方法。方法是类中的一种操作,用于执行特定的任务,比如计算、显示信息等等。

下面是一个Person类的改进版本,它增加了一个showInfo()方法:

class Person {
    public $name;
    public $age;
    public $gender;

    public function showInfo() {
        echo "Name: ".$this->name."
"; echo "Age: ".$this->age."
"; echo "Gender: ".$this->gender."
"; } }

在这个改进版本中,我们增加了一个showInfo()方法,它可以将$person对象的属性输出到HTML页面上。

接下来,我们可以使用以下代码来创建一个Person对象,并调用它的showInfo()方法:

$person = new Person();
$person->name = 'Jack';
$person->age = 20;
$person->gender = 'male';
$person->showInfo();

运行上面的代码,将会得到以下输出:

Name: Jack
Age: 20
Gender: male

三、继承和多态

继承(Inheritance)是OOP的一个核心概念。继承是指一个类可以从另一个类中继承属性和方法。被继承的类称为父类(或基类),继承它的类称为子类。

下面是一个例子,它演示了如何实现继承:

class Animal {
    public $name;
    public $age;
    public $gender;

    public function showInfo() {
        echo "Name: ".$this->name."
"; echo "Age: ".$this->age."
"; echo "Gender: ".$this->gender."
"; } } class Dog extends Animal { public function bark() { echo "Woof! Woof!
"; } }

在上面的例子中,我们定义了一个名为Animal的类,它有三个属性:$name、$age和$gender,还有一个showInfo()方法。接下来,我们定义了一个名为Dog的类,它继承了Animal类,并增加了一个bark()方法。

接下来,我们可以创建一个Dog对象,并调用它的bark()和showInfo()方法:

$dog = new Dog();
$dog->name = 'Snoopy';
$dog->age = 3;
$dog->gender = 'male';
$dog->showInfo();
$dog->bark();

运行上面的代码,将会得到以下输出:

Name: Snoopy
Age: 3
Gender: male
Woof! Woof!

多态(Polymorphism)是面向对象编程的另一个重要概念。多态是指同一种操作,在不同的对象上呈现不同的行为。在PHP中,多态通常通过重载(Overloading)和覆盖(Overriding)来实现。

下面是一个例子,演示了多态的应用:

class Shape {
    public function area() {
        return 0;
    }
}

class Rectangle extends Shape {
    private $width;
    private $height;

    public function __construct($width, $height) {
        $this->width = $width;
        $this->height = $height;
    }

    public function area() {
        return $this->width * $this->height;
    }
}

class Circle extends Shape {
    private $radius;

    public function __construct($radius) {
        $this->radius = $radius;
    }

    public function area() {
        return 3.14 * $this->radius * $this->radius;
    }
}

$shapes = array(new Rectangle(10, 20), new Circle(10));
foreach($shapes as $shape) {
    echo get_class($shape).": ".$shape->area()."
"; }

在这个例子中,我们定义了一个名为Shape的基类,它有一个area()方法,用于计算该形状的面积。接下来,我们定义了两个子类:Rectangle和Circle。这两个子类都重载了area()方法,以便能够计算自己的面积。

在代码的最后,我们创建了两个对象:一个Rectangle对象和一个Circle对象,并将它们存储在一个$shapes数组中。接着,我们使用foreach()循环遍历$shapes数组,分别调用每个对象的area()方法,并将结果输出到HTML页面上。由于Rectangle和Circle类都实现了area()方法,因此它们能够以相同的方式进行处理。这就是多态的体现。

四、引用和拷贝

在PHP中,变量本身可以存储一个对象的引用,而不是对象本身。这意味着,当我们将一个对象赋值给一个变量时,我们实际上是将该对象的引用存储在变量中,而不是创建一个新的对象。

下面是一个例子,它演示了对象引用的应用:

class Car {
    public $brand;
    public $color;
}

$car1 = new Car();
$car1->brand = 'Toyota';
$car1->color = 'Red';

$car2 = $car1;
$car2->color = 'Blue';  

echo "Car1 brand: ".$car1->brand."
"; echo "Car1 color: ".$car1->color."
"; echo "Car2 brand: ".$car2->brand."
"; echo "Car2 color: ".$car2->color."
";

在这个例子中,我们创建了一个名为Car的类,它有两个属性:$brand和$color。接着,我们创建了一个名为$car1的Car对象,并将$car1的$brand属性设置为‘Toyota’、$color属性设置为‘Red’。

接下来,我们将$car1的引用赋值给一个新变量$car2。由于$car1和$car2都指向相同的对象,因此对$car2的修改会影响到$car1。

最后,我们输出$car1和$car2的$brand和$color属性,你将会看到它们$color属性的值都被改变成了‘Blue’。

引用和拷贝的影响在PHP中会十分关键。确保你理解了对象是如何拷贝和引用的。

五、构造函数和析构函数

在PHP中,构造函数(Constructor)和析构函数(Destructor)是两个十分重要的函数。构造函数用于创建一个对象时执行的初始化操作,而析构函数用于销毁一个对象时执行的清理操作。

下面是一个例子,它演示了如何在PHP中使用构造函数和析构函数:

class Counter {
    private static $count = 0;

    public function __construct() {
        self::$count++;
    }

    public function __destruct() {
        self::$count--;
    }

    public function getCount() {
        return self::$count;
    }
}

$counter1 = new Counter();
echo "Count: ".$counter1->getCount()."
"; $counter2 = new Counter(); echo "Count: ".$counter2->getCount()."
"; unset($counter1); echo "Count: ".$counter2->getCount()."
";

在上面的例子中,我们创建了一个名为Counter的类。Counter类有一个静态属性$Count和一个__construct()构造函数和一个__destruct()析构函数。在__construct()构造函数中,我们将Counter::$count属性自增1,而在__destruct()析构函数中,我们将Counter::$count属性自减1。

在代码的最后,我们创建了两个Counter对象:$counter1和$counter2。分别输出了它们的count属性。接着,我们使用unset()函数销毁$counter1对象,最后再次输出$counter2的count属性。你将会看到输出为2、3、2,这是因为__construct()和__destruct()方法确保了$counter1对象被销毁时Counter::$count属性的值被正确更新。

六、接口与抽象类

在PHP中,接口(Interface)是一种用于声明函数并且不能实现这些函数的抽象类。接口只是定义了一个协议,实现接口的类必须实现接口中定义的所有方法。

下面是一个例子,它演示了如何使用接口:

interface Shape {
    public function area();
    public function perimeter();
}

class Triangle implements Shape {
    private $a;
    private $b;
    private $c;

    public function __construct($a, $b, $c) {
        $this->a = $a;
        $this->b = $b;
        $this->c = $c;
    }

    public function area() {
        $s = ($this->a + $this->b + $this->c) / 2;
        return sqrt($s * ($s - $this->a) * ($s - $this->b) * ($s - $this->c));
    }

    public function perimeter() {
        return $this->a + $this->b + $this->c;
    }
}

$triangle = new Triangle(3, 4, 5);
echo "Area: ".$triangle->area()."
"; echo "Perimeter: ".$triangle->perimeter()."
";

上面的例子定义了一个名为Shape的接口,它有两个方法:area()和perimeter()。接着,我们定义了一个Triangle类,它实现了Shape接口并实现了area()和perimeter()方法。

最后,我们创建了一个$triangle对象,并输出它的面积和周长。

在PHP中,抽象类(Abstract class)也是一种用于声明函数并且不能实现这些函数的类。抽象类通常用于为一个继承层次结构提供基本的实现。继承抽象类的子类必须实现抽象类中