PHP public 关键字
最后修改于 2025 年 4 月 16 日
PHP public
关键字是面向对象编程中使用的可见性修饰符。它指定属性或方法可以从任何地方访问 - 无论是在类内部还是外部。如果没有指定,public 是默认的可见性。
基本定义
public
关键字使类成员可以从任何范围访问。这包括其他类、全局范围和继承类。Public 成员构成了类的接口。
可见性修饰符控制 OOP 中的封装。PHP 有三个可见性级别:public、protected 和 private。Public 提供的限制最少。
语法:public $property;
或 public function method() {}
。Public 可以应用于类定义中的属性和方法。
基本 Public 属性
此示例演示了一个具有公共属性的简单类。
<?php declare(strict_types=1); class User { public string $name; } $user = new User(); $user->name = "John Doe"; echo "User name: " . $user->name;
$name
属性被声明为 public,允许从类外部直接访问。我们创建一个 User 实例并设置其 name 属性。Public 属性可以从外部读取和修改。
Public 方法
此示例显示了一个具有 public 方法的类,该方法可以在外部调用。
<?php declare(strict_types=1); class Calculator { public function add(int $a, int $b): int { return $a + $b; } } $calc = new Calculator(); $result = $calc->add(5, 3); echo "Result: " . $result;
add
方法是 public 的,使其可以从 Calculator 类外部调用。Public 方法通常代表类的公共 API。它们定义了类向其他代码提供的操作。
Public vs Private
此示例对比了同一个类中 public 和 private 的可见性。
<?php declare(strict_types=1); class BankAccount { public string $owner; private float $balance = 0; public function deposit(float $amount): void { $this->balance += $amount; } public function getBalance(): float { return $this->balance; } } $account = new BankAccount(); $account->owner = "Alice"; $account->deposit(100.50); echo "{$account->owner}'s balance: {$account->getBalance()}";
$owner
是 public 的,可以直接访问,而 $balance
是 private 的。public 方法提供了对 private balance 的受控访问。这演示了封装 - 隐藏实现细节,同时公开必要的功能。
继承中的 Public
此示例显示了 public 成员在类继承中的行为方式。
<?php declare(strict_types=1); class Animal { public string $species; public function makeSound(): string { return "Some generic animal sound"; } } class Dog extends Animal { public function makeSound(): string { return "Bark"; } } $dog = new Dog(); $dog->species = "Canine"; echo "{$dog->species} says: " . $dog->makeSound();
public $species
属性和 makeSound
方法被 Dog 类继承。Public 成员在子类中仍然是 public 的。Dog 类重写了 makeSound() 方法,同时保持其 public 的状态。
Public 静态属性
此示例演示了一个在所有实例之间共享的 public 静态属性。
<?php declare(strict_types=1); class Counter { public static int $count = 0; public function __construct() { self::$count++; } public static function getCount(): int { return self::$count; } } new Counter(); new Counter(); new Counter(); echo "Total instances: " . Counter::$count;
public 静态 $count
属性可以通过类名访问。每个构造函数调用都会递增它。静态 public 成员属于类而不是实例。可以在不创建对象的情况下访问它们。
Public 接口实现
此示例显示了实现接口的 public 方法。
<?php declare(strict_types=1); interface Logger { public function log(string $message): void; } class FileLogger implements Logger { public function log(string $message): void { file_put_contents('log.txt', $message . PHP_EOL, FILE_APPEND); } } $logger = new FileLogger(); $logger->log("System started");
接口方法在实现类中必须是 public 的。FileLogger 的 log
方法是 public 的,这是 Logger 接口的要求。Public 可见性确保正确履行接口契约。
Traits 中的 Public
此示例演示了类使用的 traits 中的 public 方法。
<?php declare(strict_types=1); trait Greeter { public function greet(string $name): string { return "Hello, $name!"; } } class Person { use Greeter; } $person = new Person(); echo $person->greet("John");
trait 的 greet
方法是 public 的,并且成为 Person 类的 public 接口的一部分。Traits 允许代码重用,同时保持可见性。Traits 中的 public 方法在被类使用时仍然是 public 的。
最佳实践
- 封装: 仅将 public 用于必要的类 API。
- 一致性: 在继承中保持可见性一致。
- 文档: 彻底记录 public 方法。
- 不可变: 考虑使 public 属性为只读。
- 接口: 使用接口定义公共契约。
来源
本教程介绍了 PHP 的 public 关键字,并提供了实际示例,展示了 public 属性、方法、继承和其他 OOP 上下文。
作者
列出 所有 PHP 教程。