0Pricing
PHP Academy · 课时

静态属性与方法

使用静态成员,并了解何时可以不创建实例而调用它们。

静态属性与方法 是 CoddyKit 上的免费 PHP Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PHP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PHP Academy 课程共包含 4 节课。

简介:静态属性与方法

静态成员属于类本身,而不属于任何实例。在类外部使用 ClassName::member 访问,在类内部使用 self:: 访问。所有实例共享这些成员。

核心概念

静态属性与方法的核心概念:

  • 使用 static 关键字声明
  • 使用 ::(作用域解析运算符)访问
  • 在类内部使用 self::,在类外部使用 ClassName::
  • 使用 static:: 实现后期静态绑定

静态属性

示例:

<?php
class AppConfig {
    private static array $settings = [];

    public static function set(string $key, mixed $val): void {
        self::$settings[$key] = $val;
    }

    public static function get(string $key, mixed $default = null): mixed {
        return self::$settings[$key] ?? $default;
    }
}

AppConfig::set('debug', true);
echo AppConfig::get('debug') ? 'debug on' : 'debug off';

静态方法

继续:

<?php
class MathHelper {
    public static function clamp(float $v, float $min, float $max): float {
        return max($min, min($max, $v));
    }

    public static function lerp(float $a, float $b, float $t): float {
        return $a + ($b - $a) * $t;
    }
}

echo MathHelper::clamp(150, 0, 100); // 100
echo MathHelper::lerp(0, 100, 0.5);  // 50

单例模式

练习:

<?php
class Database {
    private static ?Database $instance = null;

    private function __construct() {
        echo 'Connected to DB';
    }

    public static function getInstance(): self {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

$db1 = Database::getInstance();  // 'Connected to DB'
$db2 = Database::getInstance();  // no output — same instance
echo ($db1 === $db2) ? 'same' : 'different'; // same

静态计数器

深入理解:

<?php
class EventEmitter {
    private static int $instanceCount = 0;

    public function __construct() {
        self::$instanceCount++;
    }

    public static function count(): int {
        return self::$instanceCount;
    }
}

new EventEmitter();
new EventEmitter();
new EventEmitter();
echo EventEmitter::count();  // 3

后期静态绑定

高级用法:

<?php
class ParentClass {
    public static function create(): static {
        return new static();  // resolves to calling subclass
    }

    public function getClass(): string {
        return static::class;  // late static binding
    }
}

class ChildClass extends ParentClass {}

$obj = ChildClass::create();
echo $obj->getClass();  // ChildClass

静态工厂

实际应用模式:

<?php
class Response {
    private function __construct(
        private int   $status,
        private mixed $body
    ) {}

    public static function ok(mixed $data): self {
        return new self(200, $data);
    }

    public static function notFound(): self {
        return new self(404, ['error' => 'Not Found']);
    }

    public function toJson(): string {
        return json_encode(['status' => $this->status, 'body' => $this->body]);
    }
}

echo Response::ok(['users' => []])->toJson();

静态成员与实例成员的权衡

最佳实践:

<?php
// Static: no object needed, but harder to test/mock
class Validator {
    public static function isEmail(string $s): bool {
        return (bool) filter_var($s, FILTER_VALIDATE_EMAIL);
    }
}

// Instance: injectable dependency, testable
class ValidatorService {
    public function isEmail(string $s): bool {
        return (bool) filter_var($s, FILTER_VALIDATE_EMAIL);
    }
}
// Prefer instance classes in larger applications

实用模式

通过一个实用模式,将静态属性与方法的知识融会贯通。

常见问题

请避免在使用静态属性与方法时犯以下常见错误:

  • 所有实例共享静态成员
  • 在可继承的类中,优先使用后期静态绑定(static::),而不是 self::
  • 单例是一种常见模式,但有时会被过度使用
  • 静态方法更难在单元测试中进行模拟

快速检查

在类内部,使用哪个关键字可以访问静态属性并遵循继承关系(后期静态绑定)?

回顾:静态属性与方法

您已经学习了静态属性与方法。请记住以下要点:

  • 所有实例共享静态成员
  • 在可继承的类中,优先使用后期静态绑定(static::),而不是 self::
  • 单例是一种常见模式,但有时会被过度使用
  • 静态方法更难在单元测试中进行模拟

常见问题解答

「静态属性与方法」课时是免费的吗?

是的 — 「静态属性与方法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PHP Academy 课程的其余内容,请升级到 CoddyKit PRO。 PHP Academy 课程共包含 4 节课。

「静态属性与方法」这节课中我会学到什么?

使用静态成员,并了解何时可以不创建实例而调用它们。 你通过在浏览器中直接运行的动手代码来练习 PHP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 PHP Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 PHP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「静态属性与方法」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 PHP Academy 课中编写并运行代码吗?

能。每节 PHP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 类、属性与方法
  2. 构造方法与析构方法
  3. 静态属性与方法
  4. 魔术方法概览
← 返回 PHP Academy