如何创建静态变量并在其他类中调用?PHP类变量调用问题
解决跨类动态变量调用的Undefined Variable错误
咱们来一步步拆解你的问题,然后修复它:
问题根源分析
你遇到的Undefined variable: weddingNameVariable错误,主要有三个核心原因:
- 局部变量无法外部访问:
DB_Bookings类的updated_variables()方法里,$weddingNameVariable是方法内部的局部变量,没有任何返回操作,所以外部调用这个方法根本拿不到它的值。 - 调用方式错误:你在
DB_Bookings_Admin里调用DB_Bookings::updated_variables($weddingNameVariable)时,$weddingNameVariable这个变量在当前方法的上下文里完全没定义,PHP自然会报错。 - 依赖全局变量的隐患:原方法里用了
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
相关产品推荐
相关产品推荐

