第页上的类变量不正确

时间:2013-07-31 作者:user417627

我正在尝试将插件中的一些变量用于页面上的类实例。但它没有显示正确的值。

以下是插件的相关部分:

class opi{
    // version
    public $opi_version = "1.0";

    public $mg = 0;

    //constructor
    public function opi(){
        $this->__construct();
    }

    public function __construct(){
        add_action(\'init\', array(&$this, \'o_check\'));
        // ...
    }

    function o_check(){
        if (is_user_logged_in()){
            $this->mg = 4;
        }
    }
}
$opi = new opi;
如果我把echo $this->mg; 就在o_check() 函数,然后显示4. 好的

现在,如果我把下面的内容放在第页。php,然后我登录WordPress,我得到了结果0.

<?php $pageopi = new opi; ?>
<?php echo $pageopi->mg; ?>
你知道我哪里做错了吗?

3 个回复
最合适的回答,由SO网友:M-R 整理而成

当你写代码的时候

<?php $pageopi = new opi; ?>
// 1. object created
// 2. __construct is called
// 3. init action hook is set but is never executed so is o_check method
<?php echo $pageopi->mg; ?>
现阶段,init 钩子早就被执行了$pageopi 实际上是在加载页面时创建的。init 动作挂钩甚至在page.php 开始执行。

Solution:

<您应该使用global $opi; 对象页。php而不是创建新的。

或在init 行动钩(inplugins_loaded 挂钩)并将其用于page.php

SO网友:montrealist

你不是在执行o_check 在您的page.php, 因此mg 变量保持为零。

在构造函数中,您添加了一个动作挂钩,是的,但它只会在下一次页面刷新时生效。考虑使用do_action 同样,虽然我不确定是否执行一个,然后立即执行另一个。

SO网友:s_ha_dum

如果添加此部件:

<?php $pageopi = new opi; ?>
<?php echo $pageopi->mg; ?>
在主题模板中,它将在init 吊钩运行,因此o_check 方法将永远不会运行。这就是问题所在。这就是为什么如果在对象下初始化,而不是在页面模板中初始化,它会起作用。您需要更改挂钩,或更早地初始化,或调用o_check 明确地

将对象初始化为global 会有用的。

class opi{
  // ...
}
global $opi;
$opi = new opi;
然后,在模板中,您可以使用:

global $opi;
echo $opi->mg;
尽管您使用它的方式与静态类一样好或更好。很难说。我不知道这门课的最终目的是什么。

结束