【php快速上手(九)】

发布于:2024-04-17 ⋅ 阅读:(115) ⋅ 点赞:(0)

PHP快速上手(九)

PHP 面向对象

PHP 的面向对象编程(OOP)是一种编程范式,它将代码组织成对象,每个对象都具有属性(属性)和行为(方法)。PHP 支持完整的面向对象编程特性,包括类、继承、多态、封装、接口、抽象类、特性等。下面详细讲解 PHP 中面向对象编程的核心概念和特性:

1. 类和对象

在面向对象编程中,类是一个模板,用于定义对象的属性和方法。对象是类的实例,每个对象都具有类中定义的属性和方法。

定义类

class Person {
    // 属性
    public $name;
    public $age;

    // 方法
    public function introduce() {
        echo "My name is " . $this->name . " and I am " . $this->age . " years old.";
    }
}

在上面的示例中,我们定义了一个名为 Person 的类,包含两个属性 name 和 age,以及一个方法 introduce()。

创建对象

// 创建对象
$person = new Person();
$person->name = "Alice";
$person->age = 30;

// 调用对象的方法
$person->introduce();
// 输出: My name is Alice and I am 30 years old.

2. 访问控制修饰符

PHP 支持三种访问控制修饰符,用于控制类中属性和方法的访问权限:

  • public: 公有属性或方法,可以在类的内部、外部以及继承的子类中访问。
  • protected: 受保护属性或方法,只能在类的内部和继承的子类中访问。
  • private: 私有属性或方法,只能在类的内部访问,子类无法访问。
    示例
class Car {
    public $make; // 公有属性
    protected $model; // 受保护属性
    private $year; // 私有属性

    public function setYear($year) {
        $this->year = $year;
    }

    public function getYear() {
        return $this->year;
    }
}

3. 构造函数和析构函数

  • 构造函数:在类的实例化过程中自动调用。可以用来初始化对象的属性。
  • 析构函数:在对象销毁之前自动调用。可以用来释放资源。
    示例
class Animal {
    public $name;

    public function __construct($name) {
        $this->name = $name;
        echo "An animal named " . $this->name . " was created.\n";
    }

    public function __destruct() {
        echo "An animal named " . $this->name . " was destroyed.\n";
    }
}

$dog = new Animal("Dog");
// 输出: An animal named Dog was created.

unset($dog);
// 输出: An animal named Dog was destroyed.

4. 继承和多态

继承:子类可以继承父类的属性和方法。子类可以重写父类的方法,并添加自己的属性和方法。
多态:通过重写父类的方法,子类可以表现出不同的行为。
示例

class Animal {
    public function speak() {
        echo "The animal makes a sound.\n";
    }
}

class Dog extends Animal {
    public function speak() {
        echo "The dog barks.\n";
    }
}

$animal = new Animal();
$animal->speak(); // 输出: The animal makes a sound.

$dog = new Dog();
$dog->speak(); // 输出: The dog barks.

5. 接口和抽象类

  • 接口:定义一组方法的契约,类可以实现接口中的方法。接口不包含方法的实现。
  • 抽象类:包含一个或多个抽象方法的类。抽象方法没有方法体。子类必须实现所有抽象方法。
    示例:接口
interface Animal {
    public function speak();
}

class Dog implements Animal {
    public function speak() {
        echo "The dog barks.\n";
    }
}

示例:抽象类

abstract class Animal {
    abstract public function speak();
}

class Dog extends Animal {
    public function speak() {
        echo "The dog barks.\n";
    }
}

$dog = new Dog();
$dog->speak(); // 输出: The dog barks.

6. 特性(Trait)

PHP 支持特性,它是一种代码复用的机制,可以将一组方法定义在特性中,并在类中使用。

示例

trait SayHello {
    public function sayHello() {
        echo "Hello!\n";
    }
}

class Greeter {
    use SayHello;
}

$greeter = new Greeter();
$greeter->sayHello(); // 输出: Hello!

7. 静态属性和方法

类中的属性和方法可以声明为静态(static),以便不需要实例化对象即可访问。

示例

class Math {
    public static $pi = 3.14;

    public static function add($a, $b) {
        return $a + $b;
    }
}

echo Math::$pi; // 输出: 3.14
echo Math::add(3, 4); // 输出: 7

这些是 PHP 中面向对象编程的核心概念和特性。通过面向对象编程,你可以将代码组织成模块化的对象,使代码更易于维护和扩展。

PHP EOF

在 PHP 中,EOF(End of File)标记常用于定界符语法(delimiter syntax)中的一种特殊形式,用来创建多行字符串。这种语法称为Here Document或Heredoc语法。

1.Heredoc 语法

Heredoc 语法允许你定义一个多行字符串,字符串的内容可以包括换行符、变量和转义序列。Heredoc 语法的特点是使用一个标记来表示字符串的开始和结束。标记必须是一个合法的标识符(不包含空格或特殊字符),并且该标识符必须独立于一行。

Heredoc 语法的格式

<<<标记
多行字符串内容...
标记;

在上面的格式中,<<<标记表示字符串的开始,而标记;表示字符串的结束。标记的名称可以是任意合法的标识符,只要它在开头和结尾保持一致。字符串内容在标记之间。

示例

$message = <<<MSG
Hello, this is a multi-line message.
You can include variables like: \$name = "Alice".
This is useful for creating templates or long texts.
MSG;

echo $message;

在上面的示例中,定义了一个名为 $message 的多行字符串,内容从 <<<MSG 到 MSG; 之间。在多行字符串中,你可以包含变量、特殊字符和转义序列。

2.Nowdoc 语法

Nowdoc 语法是 Heredoc 语法的一个变种,用于表示一个纯文本字符串。在 Nowdoc 语法中,不会解析字符串中的变量和转义序列。

Nowdoc 语法的格式

<<<'标记'
多行纯文本内容...
标记;

与 Heredoc 语法类似,Nowdoc 语法使用标记来表示字符串的开始和结束,但开头标记周围需要单引号 '。这表示字符串内容是纯文本,不会进行变量替换或转义序列处理。

示例

$message = <<<'MSG'
Hello, this is a multi-line pure text message.
You cannot include variables like: $name = "Alice".
This is useful for creating plain text content.
MSG;

echo $message;

在上面的示例中,定义了一个名为 $message 的多行纯文本字符串,内容从 <<<‘MSG’ 到 MSG; 之间。由于是 Nowdoc 语法,所以字符串中的变量 $name 不会被解析。


网站公告

今日签到

点亮在社区的每一天
去签到