You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过services.yaml设置PHP类的公共静态属性?

技术问询

如何使用services.yaml文件设置类的公共静态属性?

示例类

<?php

class TelegramLog
{
    protected static $logger;
    protected static $update_logger;

    public static $always_log_request_and_response = false;
    public static $remove_bot_token = true;

    public static function initialize(LoggerInterface $logger = null, LoggerInterface $update_logger = null): void
    {
        self::$logger        = $logger ?: new NullLogger();
        self::$update_logger = $update_logger ?: new NullLogger();
    }
}

当前services.yaml配置片段

Longman\TelegramBot\TelegramLog:
  calls:
    - initialize:
       $logger: '@logger'
       $update_logger: '@logger'

我曾尝试使用properties关键字,但它仅对对象属性生效。我希望通过services.yaml修改$always_log_request_and_response和$remove_bot_token这两个属性的默认值。


解决方案

Symfony的DI容器本身不支持通过properties关键字直接配置静态属性,但可以通过以下两种方式实现需求:

1. 用表达式语言直接赋值(无需修改原类)

利用Symfony DI的表达式语言特性,直接在配置中对静态属性赋值,无需改动原有类代码:

Longman\TelegramBot\TelegramLog:
  calls:
    - initialize:
        $logger: '@logger'
        $update_logger: '@logger'
  expressions:
    - "Longman\\TelegramBot\\TelegramLog::$always_log_request_and_response = true"
    - "Longman\\TelegramBot\\TelegramLog::$remove_bot_token = false"

容器初始化该服务时,会自动执行这些表达式,直接修改目标静态属性的取值。

2. 添加静态配置方法(需修改原类)

如果更倾向于封装属性修改逻辑,可以给TelegramLog新增一个静态配置方法,再通过configurator调用:

首先更新PHP类:

<?php

class TelegramLog
{
    // ... 原有代码保持不变 ...

    public static function configureStaticProperties(bool $alwaysLog, bool $removeToken): void
    {
        self::$always_log_request_and_response = $alwaysLog;
        self::$remove_bot_token = $removeToken;
    }
}

然后修改services.yaml配置:

Longman\TelegramBot\TelegramLog:
  calls:
    - initialize:
        $logger: '@logger'
        $update_logger: '@logger'
  configurator: ['Longman\TelegramBot\TelegramLog', 'configureStaticProperties']
  arguments:
    $alwaysLog: true
    $removeToken: false

这种方式把静态属性的修改逻辑集中在类内部,更符合面向对象的设计原则。


内容的提问来源于stack exchange,提问作者Artem Chernov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:42:11