所以我有以下代码:
public function pcieh_shortcodes_init() {
$data = $this->data;
var_dump($data); //Return an array which is Expected
function pcieh_shortcode($atts = [], $content = null) {
global $data;
var_dump($data); //Return NULL
}
add_shortcode('pcieh', 'pcieh_shortcode');
}
当我调用pcieh_shortcodes_int
时,我希望pcieh_shortcode
中的$ data与外部$ data具有相同的值,因为它是全局的,但它返回NULL。为什么这样,我该如何解决?
而不是这个
public function pcieh_shortcodes_init() {
$data = $this->data;
var_dump($data); //Return an array which is Expected
function pcieh_shortcode($atts = [], $content = null) {
global $data;
var_dump($data); //Return NULL
}
add_shortcode('pcieh', 'pcieh_shortcode');
}
为什么不呢
public function pcieh_shortcodes_init() {
$data = $this->data;
var_dump($data); //Return an array which is Expected
add_shortcode('pcieh', [$this,'pcieh_shortcode']);
}
public function pcieh_shortcode($atts = [], $content = null) {
var_dump($this->data); //Return NULL
}
然后就不需要global
或任何与之相关的丑陋。将类和方法作为数组传递是完全可以接受的。
基本上wordpress正在使用call_user_func
来调用它。
http://php.net/manual/en/function.call-user-func.php
UPDATE
我应该注意到,在问题的原始代码中,即使你确实让它工作,你也没有引用这个类的实际实例,所以你在数据中设置的任何值(在分配短代码和全局之后) )无论如何都可能会丢失。换句话说,您将丢失当前对象的状态及其包含的任何数据。
因此,通过使用实际的实例$this
,您可以确定您实际上正在处理您想要的实例。