PHP OOP - 访问修饰符详解

访问修饰符是面向对象编程(OOP)中的重要概念,用于控制类成员的可见性和访问权限。PHP提供了三种访问修饰符:publicprotectedprivate。合理使用这些修饰符可以提高代码的安全性和可维护性。

public 修饰符

public成员可以在任何地方被访问,包括类外部、子类以及类内部。这是最开放的访问级别。

class User {
    public $name;
    
    public function greet() {
        return "Hello, " . $this->name;
    }
}

$user = new User();
$user->name = "John"; // 直接访问public属性
echo $user->greet();  // 输出: Hello, John

protected 修饰符

protected成员只能在类内部和子类中访问,不能在类外部直接访问。

class User {
    protected $password;
    
    protected function setPassword($pass) {
        $this->password = password_hash($pass, PASSWORD_DEFAULT);
    }
}

class Admin extends User {
    public function changePassword($pass) {
        $this->setPassword($pass); // 子类可以访问protected方法
    }
}

$admin = new Admin();
$admin->changePassword("secret");
// $admin->password; // 错误: 无法在外部访问protected属性

private 修饰符

private成员只能在定义它的类内部访问,子类和外部代码都无法直接访问。

class Database {
    private $connection;
    
    private function connect() {
        $this->connection = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
    }
    
    public function query($sql) {
        $this->connect(); // 类内部可以访问private方法
        return $this->connection->query($sql);
    }
}

$db = new Database();
$result = $db->query("SELECT * FROM users");
// $db->connect(); // 错误: 无法在外部访问private方法

访问修饰符在继承中的行为

理解访问修饰符在继承中的行为很重要,这有助于设计良好的类层次结构。

class ParentClass {
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';
    
    public function printProperties() {
        echo $this->public;    // 可访问
        echo $this->protected; // 可访问
        echo $this->private;   // 可访问
    }
}

class ChildClass extends ParentClass {
    public function printChildProperties() {
        echo $this->public;    // 可访问
        echo $this->protected; // 可访问
        // echo $this->private; // 错误: 不可访问
    }
}

$obj = new ChildClass();
$obj->printProperties();
$obj->printChildProperties();
echo $obj->public;    // 可访问
// echo $obj->protected; // 错误: 不可访问
// echo $obj->private;   // 错误: 不可访问

访问修饰符的最佳实践

合理使用访问修饰符可以提高代码的封装性和安全性。以下是一些最佳实践:

  • 将属性设置为privateprotected,并通过公共方法(getters/setters)控制访问
  • 仅在需要时使用public,避免暴露内部实现细节
  • 对于只在类内部使用的辅助方法,使用private修饰符
  • 对于需要在子类中扩展的方法,使用protected修饰符
class Product {
    private $price;
    
    public function setPrice($price) {
        if ($price > 0) {
            $this->price = $price;
        }
    }
    
    public function getPrice() {
        return $this->price;
    }
    
    protected function calculateDiscount($percent) {
        return $this->price * (1 - $percent/100);
    }
}

class SaleProduct extends Product {
    public function getDiscountedPrice($percent) {
        return $this->calculateDiscount($percent); // 可以访问protected方法
    }
}

$product = new SaleProduct();
$product->setPrice(100);
echo $product->getDiscountedPrice(20); // 输出: 80
// $product->calculateDiscount(20); // 错误: 无法访问protected方法

通过合理使用访问修饰符,可以构建更加健壮、安全的面向对象PHP应用程序。理解并正确应用这些概念是成为优秀PHP开发者的重要一步。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐