在面向对象的PHP中声明全局变量

时间:2018-04-09 作者:Simo Patrek

我正在开发插件&;我想声明一个全局wordpress变量$current_screen 为了检查用户是否在目标页面或其他页面上,我的方法是这样的,但没有成功。

class my_Class {

    public $current_screen;

    public function __construct() {
        global $current_screen;
        add_action( \'current_screen\', array( $this, \'Current_Screen\') );
    }

    public function Current_Screen() {
         if ( $current_screen->parent_base == \'slug-page\' ) {
             // Do Something ...
         }
    }
}
不幸的是,除了致命的错误外,什么都没有发生。所以拜托伙计们,我想帮忙。提前谢谢。

2 个回复
SO网友:Nathan Johnson

这个$current_screen 作为变量传递给从current_screen

在此挂钩之前$current_screen 未设置,因此全局化变量无论如何都不会起任何作用。

此外,WordPress还提供了方便的功能get_current_screen() 返回全局$current_screen 变量(如果存在)。

class wpse {
  protected $current_screen;
  public function load() {
    add_action( \'current_screen\', [ $this, \'current_screen\' ] );
  }
  public function current_screen( $current_screen ) {
    $this->current_screen = $current_screen;
  }
}
add_action( \'plugins_loaded\', [ new wpse(), \'load\' ] );

SO网友:Jacob Peattie

打电话还不够global 在里面__construct(). global 仅使变量在current scope, 这正是__construct() 方法

要使其在其他方法中可用,您需要在每个方法中单独调用它:

class MyClass {
    public function __construct() {
        add_action( \'init\', array( $this, \'method\') );
    }

    public function method() {
        global $global_variable;

         if ( $global_variable ) {
             // Do Something ...
         }
    }
}
另一个选项是将全局变量指定为类属性,然后在每个方法中使用$this->:

class MyClass {
    public $property;

    public function __construct() {
        global $global_variable;

        $this->property = $global_variable;

        add_action( \'init\', array( $this, \'method\') );
    }

    public function method() {
         if ( $this->property ) {
             // Do Something ...
         }
    }
}
然而,正如Nathan在回答中所指出的那样,您需要注意实例化类的时间,因为全局变量可能在那时不可用。

在这些情况下,您需要使用我的第一个示例,以便仅在已创建变量的点连接到生命周期的函数中引用该变量。

结束

相关推荐

为什么dbDelta()不能捕获MysqlErrors?

据我所见,dbDelta() 用于抑制在其操作过程中发生的数据库错误。一般来说,情况似乎是这样,但New Relic仍在报告函数中的MysqlErrors。准确的错误消息格式如下:MysqlError: Table \'xxx.wp_yyy_posts\' doesn\'t exist 发件人dbDelta() 在里面/wp-admin/includes/upgrade.php, 我们有:// Fetch the table column structure from the database&