📜  PHP oops封装(1)

📅  最后修改于: 2023-12-03 15:03:35.509000             🧑  作者: Mango

PHP OOP封装

封装是面向对象编程中一个重要的概念,它指的是将对象的属性和方法包装到一起,并限制其他代码直接访问和修改对象的属性。在PHP中,封装通过访问修饰符来实现,包括public、protected和private。

访问修饰符
Public

Public修饰的属性和方法可以在任何地方被访问和调用,包括对象内部、子类和其他代码中。例如:

class Person {
  public $name = 'Bob';
  
  public function sayHello() {
    echo 'Hello, My name is ' . $this->name;
  }
}

$person = new Person();
echo $person->name; // 输出 "Bob"
$person->sayHello(); // 输出 "Hello, My name is Bob"
Protected

Protected修饰的属性和方法只能在对象内部和子类中访问和调用,而不能在其他代码中直接访问。例如:

class Person {
  protected $age = 20;
  
  protected function getAge() {
    return $this->age;
  }
}

class Employee extends Person {
  public function displayAge() {
    echo 'My age is ' . $this->getAge();
  }
}

$employee = new Employee();
$employee->displayAge(); // 输出 "My age is 20"
Private

Private修饰的属性和方法只能在对象内部访问和调用,而不能在子类和其他代码中直接访问。例如:

class Person {
  private $email = 'bob@example.com';
  
  private function getEmail() {
    return $this->email;
  }
  
  public function displayEmail() {
    echo 'My email is ' . $this->getEmail();
  }
}

$person = new Person();
$person->displayEmail(); // 输出 "My email is bob@example.com"
封装数据

封装数据是指将对象的属性封装起来,限制其他代码直接访问和修改属性值。我们可以通过定义getter和setter方法来操作属性值。例如:

class Person {
  private $age;
  
  public function getAge() {
    return $this->age;
  }
  
  public function setAge($age) {
    if ($age < 0) {
      throw new Exception("Age cannot be negative");
    }
    $this->age = $age;
  }
}

$person = new Person();
$person->setAge(20);
echo $person->getAge(); // 输出 "20"

在上面的例子中,我们定义了一个私有的age属性,并通过公有的getter和setter方法来访问和修改属性值。在setter方法中,我们还添加了错误验证,如果年龄小于0,则抛出异常。

封装行为

封装行为是指将对象的方法封装起来,并限制其他代码直接调用方法。我们可以通过将方法定义为私有或受保护的来实现。例如:

class Person {
  private function doSomething() {
    echo 'Doing something...';
  }
  
  public function doPublicAction() {
    $this->doSomething();
  }
}

$person = new Person();
$person->doPublicAction(); // 输出 "Doing something..."

在上面的例子中,我们定义了一个私有的doSomething方法,它不能被其他代码直接调用。我们还定义了一个公有的doPublicAction方法,它可以调用doSomething方法。这样,我们就将doSomething方法封装起来,并限制其他代码直接访问和调用方法。

封装实例

封装实例是指通过将属性和方法封装在一个类中,并暴露出公共接口,来实现抽象、封装和继承。例如:

abstract class Vehicle {
  protected $speed;
  
  public function getSpeed() {
    return $this->speed;
  }
  
  public function setSpeed($speed) {
    $this->speed = $speed;
  }
  
  abstract public function move();
}

class Car extends Vehicle {
  public function move() {
    echo 'Driving at speed ' . $this->getSpeed();
  }
}

$car = new Car();
$car->setSpeed(60);
$car->move(); // 输出 "Driving at speed 60"

在上面的例子中,我们定义了一个抽象的Vehicle类,它封装了速度属性和移动方法。我们还定义了一个具体的Car类,它继承了Vehicle类,并实现了move方法。这样,我们就将速度和移动功能封装在了Vehicle类中,同时也实现了抽象和继承的概念。

总结

封装是面向对象编程中一个重要的概念,它通过访问修饰符、getter和setter方法、私有方法等技术来实现。通过封装,我们可以将对象的属性和方法封装起来,以保证对象的完整性和安全性。