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 教程。