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

如何创建静态变量并在其他类中调用?PHP类变量调用问题

解决跨类动态变量调用的Undefined Variable错误

咱们来一步步拆解你的问题,然后修复它:

问题根源分析

你遇到的Undefined variable: weddingNameVariable错误,主要有三个核心原因:

  1. 局部变量无法外部访问:DB_Bookings类的updated_variables()方法里,$weddingNameVariable是方法内部的局部变量,没有任何返回操作,所以外部调用这个方法根本拿不到它的值。
  2. 调用方式错误:你在DB_Bookings_Admin里调用DB_Bookings::updated_variables($weddingNameVariable)时,$weddingNameVariable这个变量在当前方法的上下文里完全没定义,PHP自然会报错。
  3. 依赖全局变量的隐患:原方法里用了global $post,这种依赖全局变量的写法不够健壮,在某些场景下(比如后台异步操作)可能会导致$post不存在的问题。

修复步骤与代码示例

第一步:重构DB_Bookings的updated_variables()方法

我们需要让这个方法返回计算后的变量值,并且把$post作为参数传入(替代全局变量),让方法更可靠:

class DB_Bookings {
    // ... 你的其他类代码 ...

    // 改成静态方法,方便跨类直接调用;如果你的类需要实例化使用,也可以保持非静态
    public static function updated_variables($post) {
        $compare_date = strtotime("2018-05-22");
        $post_date = strtotime($post->post_date);

        // 用三元表达式简化逻辑,直接返回结果
        return $compare_date > $post_date ? 'db-bookingsweddingname' : 'weddingName';
    }
}

第二步:修正DB_Bookings_Admin里的调用逻辑

现在你可以正确调用方法并拿到需要的元键,不需要传那个未定义的变量:

class DB_Bookings_Admin {
    // ... 你的其他类代码 ...

    public function save_metabox($post_id, $post) {
        // ... 你的其他保存逻辑 ...

        // 调用静态方法,传入当前的$post对象,拿到正确的元键
        $meta_key = DB_Bookings::updated_variables($post);
        // 执行元数据保存
        update_post_meta($post_id, $meta_key, $db_bookingsnew_weddingname);

        // ... 你的其他保存逻辑 ...
    }
}

额外的健壮性优化(可选)

为了避免一些边缘情况导致的错误,比如$post不是合法的WP_Post对象,或者strtotime解析日期失败,可以给方法加一些容错处理:

public static function updated_variables($post) {
    // 检查传入的$post是否是合法的WP_Post对象
    if (!($post instanceof WP_Post)) {
        error_log('Invalid WP_Post object passed to updated_variables');
        return 'weddingName'; // 返回默认值
    }

    $compare_date = strtotime("2018-05-22");
    $post_date = strtotime($post->post_date);

    // 处理日期解析失败的情况
    if ($post_date === false) {
        error_log('Failed to parse post date: ' . $post->post_date);
        return 'weddingName'; // 返回默认值
    }

    return $compare_date > $post_date ? 'db-bookingsweddingname' : 'weddingName';
}

注意事项

  • 如果你的DB_Bookings类需要依赖实例化后的属性(比如构造函数里的配置),那不要用静态方法,而是在save_metabox里实例化对象再调用:
    $bookings_instance = new DB_Bookings();
    $meta_key = $bookings_instance->updated_variables($post);
    
  • 确保$db_bookingsnew_weddingname变量在save_metabox方法里已经正确定义,不然可能会出现新的未定义变量错误。

内容的提问来源于stack exchange,提问作者Sam Skirrow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:35:18