ZetCode

PHP public 关键字

最后修改于 2025 年 4 月 16 日

PHP public 关键字是面向对象编程中使用的可见性修饰符。它指定属性或方法可以从任何地方访问 - 无论是在类内部还是外部。如果没有指定,public 是默认的可见性。

基本定义

public 关键字使类成员可以从任何范围访问。这包括其他类、全局范围和继承类。Public 成员构成了类的接口。

可见性修饰符控制 OOP 中的封装。PHP 有三个可见性级别:public、protected 和 private。Public 提供的限制最少。

语法:public $property;public function method() {}。Public 可以应用于类定义中的属性和方法。

基本 Public 属性

此示例演示了一个具有公共属性的简单类。

basic_public_property.php
<?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 方法的类,该方法可以在外部调用。

public_method.php
<?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 的可见性。

public_vs_private.php
<?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 成员在类继承中的行为方式。

public_inheritance.php
<?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 静态属性。

public_static.php
<?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 方法。

public_interface.php
<?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 方法。

public_trait.php
<?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 的。

最佳实践

来源

PHP 可见性文档

本教程介绍了 PHP 的 public 关键字,并提供了实际示例,展示了 public 属性、方法、继承和其他 OOP 上下文。

作者

我叫 Jan Bodnar,是一个充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出 所有 PHP 教程