首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替代Globals

替代Globals
EN

Stack Overflow用户
提问于 2014-09-17 20:13:53
回答 3查看 1.9K关注 0票数 4

我有一组变量,需要在我的网站上访问。虽然我可以在我的header.php文件中声明它们,但我倾向于在functions.php中定义它们,或者只是在一个模板文件(视图)中不定义它们。我读到的所有东西都说不要用环球的.好吧。那么,定义这些变量的最佳方法是什么呢?

以下是我想要定义的:

代码语言:javascript
复制
 global $favorites_array;
 global $user;
 global $user_id;
 global $user_name;
 global $uri;

 $user = wp_get_current_user();
 $user_name = $user->user_login;
 $user_id = $user->ID;
 $user_id = get_current_user_id();
 $uri = $_SERVER['REQUEST_URI'];
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-17 20:56:15

您发现的反对使用全局(或尽可能避免使用它们)的常见建议通常是很好的建议,您应该首先寻找替代方案,而不是使用它们。最常见的替代方法是将这些值作为参数传递到函数中。

WordPress的许多功能已经依赖于全局变量,而查看源代码似乎实际上正在设置一个名为$current_user的全局变量。

wp_get_current_user() 已经有人居住:的多次调用

代码语言:javascript
复制
if ( isset( $current_user ) && ( $current_user instanceof WP_User ) && ( $id == $current_user->ID ) )
    return $current_user;

因此,查看您打算设置的变量列表,我认为它们中的任何一个都不需要任何容器变量。我的建议是尽可能在代码中选择显式可读性。由于WordPress提供的函数wp_get_current_user()的目的是获取用户,而不是创建global $user并传递给用户,所以调用可用的函数。例如,不能在字符串插值中使用函数调用,这是事实:

代码语言:javascript
复制
// Can't do this:
echo "The user is {wp_get_current_user()->user_login}";

..。因此,如果您原本打算为用户的登录创建一个全局变量,请在函数中的其中一个上设置一个本地变量。

代码语言:javascript
复制
function your_func() {
  $login = wp_get_current_user()->user_login;
  echo "The user is $login";
}

至于设置像$user_id这样的变量,它作为用户对象的ID属性的容器,因为ID确实是用户对象的属性,在代码中维护这种关系具有很好的逻辑意义。虽然这可能会更快地键入:

代码语言:javascript
复制
echo $user_id;

这就明确了变量的来源:

代码语言:javascript
复制
echo wp_get_current_user()->ID;
// or even better, using the API function
echo wp_get_current_user_id();

最后,关于$_SERVER数组,它已经是PHP超全局数组了,可以在所有作用域中使用,而不需要任何额外的工作。因此,与其以以下形式从其中抽象出一个键,不如:

代码语言:javascript
复制
$uri = $_SERVER['REQUEST_URI'];

我选择,只需在您自己的函数中直接使用、、。例如,如果您发现需要在一个函数中多次使用它,那么可以在函数中创建一个局部变量:

代码语言:javascript
复制
function uses_uri() {
  $uri = $_SERVER['REQUEST_URI'];
  echo "I like to say $uri over and over $uri $uri $uri";
}

但是,同样,如果您使用的是超全局值,那么如果直接使用它或者定义局部变量在使用它的地方附近(而不是在单独的包含文件中定义的全局变量,那么它的值必须被追溯回来才能被理解),那么代码就会更容易读懂。

因为我对WordPress的API不太熟悉,所以我不能肯定它是否提供了一个API函数来检索请求URI。但是,如果这样的函数已经存在,并且通常在WP代码中使用,我不会感到惊讶。

票数 4
EN

Stack Overflow用户

发布于 2014-09-17 21:10:27

你说得对,你不应该用球体。一种方法是将主题代码放入类中并实例化它。

下面的示例使用了单例样式类定义和主题模板文件可能需要的变量,我认为它实现了您的尝试。

functions.php:

代码语言:javascript
复制
class My_Theme {
    public $favorites_array;
    public $user;
    public $user_id;
    public $user_name;
    public $uri;

    protected function __construct(){
        // TODO: put all your add_filter and add_action calls here  

        $this->favorites_array = array();
        $this->user = wp_get_current_user();
        $this->user_name = $this->user->user_login;
        $this->user_id = get_current_user_id();
        $this->uri = $_SERVER['REQUEST_URI']; 
    }

    function get_instance() {
        static $instance;
        if( ! isset( $instance ) )
            $instance = new self();

        return $instance;
    }
}

My_Theme::get_instance();

然后在header.php中你可以得到:

代码语言:javascript
复制
<?php
    $my_theme = My_Theme::get_instance();
?>
<html>
    ...
    ...
    <title>Hello <?php echo( esc_html( $my_theme->user_name ) ); ?></title>

我还应该指出,根据您所拥有的变量的外观,您可能只需要$favorites_array,因为其他变量都可以使用WordPress函数检索,而且都是多余的。

票数 2
EN

Stack Overflow用户

发布于 2014-09-17 21:17:02

嗯,有很多博客说“不要使用全球的”,但实际上并没有解释原因。在所有的语言中,我们都有“全球性”。这似乎不是个问题。我们能找到的唯一“问题”是,在一个大型代码中,很难找到全局问题,因为它们(在许多情况下)位于不同的文件中(一个巨大的C dev可以有超过100个文件)。在PHP中,代码通常很短。

实际上,您必须考虑的是使用命名约定来快速检测变量是否是全局的。例如把它们命名为"gl“或"glb",这是你想要的。这避免了忘记将“全局”放在函数的开头。使用会话、函数参数全局等等。每一个点都是正负两个点。没有必要避免使用其中之一。

还请注意,如果整个代码的值都保持不变,那么使用常量(定义)可能是另一个不错的选择。

问候彼得

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25899544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档