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
相关产品推荐
相关产品推荐

