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

WordPress中PHP类内函数共享属性问题:$something值为null

问题分析与解决方案

问题根源

你的passData()函数获取到$something为null,核心原因是**createText()的执行时机晚于passData()**:

  • createText()是通过add_filter挂载到woocommerce_before_checkout_form钩子上的,只有当WooCommerce触发这个钩子时,createText()才会执行,进而给$something赋值。
  • 如果passData()在这个钩子触发前就被调用,此时$something还没被赋值,自然返回null。

另外还有两个细节需要注意:

  • createText()没有显式声明访问修饰符,虽然PHP默认是public,但为了代码规范和可读性,建议加上public关键字。
  • 确保调用passData()的对象实例和挂载钩子的是同一个实例,如果存在多个ClassName实例,它们的$something属性是独立的。

解决方案

方案1:确保passData()在钩子触发后执行

将passData()挂载到woocommerce_before_checkout_form钩子之后的钩子上,比如woocommerce_checkout_init,或者直接在createText()里调用passData():

class ClassName extends X {

     private $something;

     public function __construct() {
         parent::__construct();
         add_filter( 'woocommerce_before_checkout_form', array($this, 'createText') );
         // 挂载到后续钩子
         add_action( 'woocommerce_checkout_init', array($this, 'passData') );
     }

     public function createText() {
         $property = 'xthing';
         $this->something = $property;
         return $this->something;
     }

     public function passData() {
         $somethingMore = $this->something;
         // 这里现在能拿到值了
         var_dump($somethingMore); // 输出 string(6) "xthing"
     }
}

方案2:提前手动触发赋值

如果需要在钩子触发前就获取$something的值,可以在构造函数或者调用passData()之前手动调用createText():

class ClassName extends X {

     private $something;

     public function __construct() {
         parent::__construct();
         add_filter( 'woocommerce_before_checkout_form', array($this, 'createText') );
         // 提前赋值
         $this->createText();
     }

     public function createText() {
         $property = 'xthing';
         $this->something = $property;
         return $this->something;
     }

     public function passData() {
         $somethingMore = $this->something;
         var_dump($somethingMore); // 正常输出值
     }
}

方案3:检查实例一致性

如果你的项目中存在多个ClassName实例,要确保调用passData()的是挂载钩子的那个实例。比如避免重复实例化,使用单例模式:

class ClassName extends X {

     private $something;
     private static $instance;

     private function __construct() {
         parent::__construct();
         add_filter( 'woocommerce_before_checkout_form', array($this, 'createText') );
     }

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

     public function createText() {
         $property = 'xthing';
         $this->something = $property;
         return $this->something;
     }

     public function passData() {
         $somethingMore = $this->something;
         var_dump($somethingMore);
     }
}

// 使用时
$obj = ClassName::getInstance();
$obj->passData(); // 确保是同一个实例

内容的提问来源于stack exchange,提问作者Alex Navedo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:55:22