PHP同类别静态函数间如何调用另一静态函数生成的变量?
解决PHP静态函数间共享变量的问题
嘿,这个需求其实很好实现~因为静态函数属于整个类而非实例,咱们可以通过静态属性或者重构公共方法这两种方式来共享$product_preprice的值,下面分别给你演示:
方案一:使用类的静态属性
静态属性是属于类本身的,所有静态方法都能访问到它,刚好适合这种跨静态函数共享变量的场景。
修改后的完整代码
class MyClass{ // 定义一个静态属性来存储预售价,用private保证封装性,仅类内部访问 private static $product_preprice; public static function show_preprice_value_column( $column, $post_id ) { if ( $column == 'product_preprice' ) { // 将值赋值给静态属性,而不是局部变量 self::$product_preprice = get_post_meta( $post_id, 'product_preprice', true ); if ( intval( self::$product_preprice ) > 0 ) { echo self::$product_preprice; } } } public static function show_off_value_column( $column, $post_id ) { // 这里就可以直接使用静态属性的值了 if ( $column == 'product_discount' ) { // 举个例子:用预售价计算折扣(假设你有原价字段) $product_price = get_post_meta( $post_id, '_price', true ); if ( intval( self::$product_preprice ) > 0 && intval( $product_price ) > 0 ) { $discount = round( (1 - self::$product_preprice / $product_price) * 100, 1 ); echo $discount . '%'; } } } }
注意点
- 用
self::来访问当前类的静态属性,不要直接写类名(比如MyClass::$product_preprice),后续类名修改时不用到处调整代码。 - 如果这个属性不需要对外暴露,尽量用
private或protected,符合面向对象的封装原则。
方案二:重构公共方法(更推荐)
如果$product_preprice只是需要被多个函数获取,而非存储状态,更推荐把获取预售价的逻辑抽成一个独立的静态方法,这样每个函数都可以按需调用,避免静态属性可能带来的状态污染问题。
修改后的完整代码
class MyClass{ // 抽离公共的获取预售价方法 private static function get_product_preprice( $post_id ) { $preprice = get_post_meta( $post_id, 'product_preprice', true ); return intval( $preprice ) > 0 ? $preprice : 0; } public static function show_preprice_value_column( $column, $post_id ) { if ( $column == 'product_preprice' ) { $product_preprice = self::get_product_preprice( $post_id ); if ( $product_preprice > 0 ) { echo $product_preprice; } } } public static function show_off_value_column( $column, $post_id ) { if ( $column == 'product_discount' ) { $product_preprice = self::get_product_preprice( $post_id ); $product_price = get_post_meta( $post_id, '_price', true ); if ( $product_preprice > 0 && intval( $product_price ) > 0 ) { $discount = round( (1 - $product_preprice / $product_price) * 100, 1 ); echo $discount . '%'; } } } }
为什么更推荐这个方案?
- 每个方法的职责更单一:
get_product_preprice只负责获取值,其他方法专注于展示逻辑,代码更清晰易维护。 - 避免静态属性的状态问题:比如多次调用不同
post_id的方法时,静态属性会被覆盖,而公共方法每次都会重新获取对应post_id的最新值,更可靠。
内容的提问来源于stack exchange,提问作者Ahmad
相关产品推荐
相关产品推荐

