PHP 在类函数中使用 $_SESSION 变量作为默认值

Posted

技术标签:

【中文标题】PHP 在类函数中使用 $_SESSION 变量作为默认值【英文标题】:PHP use $_SESSION variable as default in class function 【发布时间】:2019-02-22 04:01:41 【问题描述】:

我有一个类与$_SESSION 变量有很多接口。如果未指定,某些功能应默认为当前用户。我在$_SESSION['userid'] 中有用户ID,并且可以在某些地方使用它。但是,当我尝试使用 $_SESSION 变量作为函数参数的默认值时,我得到一个错误。这样做的最佳方法是什么?

这是我得到的错误:

Fatal error: Constant expression contains invalid operations in main.php on line whatever

<?php
class User 

    public function log_out() 
        unset($_SESSION['userid']);
    

    public function get_data($uid = $_SESSION['userid']) 

    

    public function logged_in() 
        return isset($_SESSION['userid']);
    

    public function enabled($uid = $_SESSION['userid']) 

    


?>

【问题讨论】:

【参考方案1】:

您不能在方法签名中使用变量。您可以将 $uid 参数默认为空。如果 $uid 为空,则在函数体中使用会话中的值。

示例

你不能这样做:

public function get_data($uid = $_SESSION['userid']) 


但是,这很好:

public function get_data($uid = null) 
    $uid = $uid ?? $_SESSION['userid'];

【讨论】:

【参考方案2】:

在 PHP 中不允许将常量表达式/调用函数作为参数的默认值。

你可以试试$uid = null;

函数内部,

$uid = $uid ?: $_SESSION['user_id'];

(?: 是 Elvis 运算符,它检查空值并替换为赋值,PHP5.3+)

但是,由于你可能会多次这样做,你可以考虑创建一个类变量并在构造函数中初始化值。

private $uid;

public __constructor($uid = null) $this->uid = uid ?: $_SESSION['user_id'];

【讨论】:

由于您明确地为 $uid 参数提供默认值 null,我认为使用空合并运算符会更合适。 是的,但是如果有人传入 false 或空字符串怎么办? uid 将是一些意想不到的值 在这种情况下,我认为使用以下内容会更合适。 $this-&gt;uid = !empty($uid) ? $uid : $_SESSION['user_id']。但是,如果您需要明确地检查您的检查,那么我会说您的类布局和命名约定有问题。就目前而言;任何看过上述类和方法的人都会明白,传递一个空字符串或 false 不是最初的程序员想要的。 $this-&gt;uid = uid ?: $_SESSION['user_id']; 实际上与$this-&gt;uid = !empty($uid) ? $uid : $_SESSION['user_id'] 没有什么不同,不是吗?任何人都知道他们不应该传递空字符串或 false,但他们可能不会在传递之前检查 $var。 顺便说一句,我的帖子有点跑题了,这个问题你的回答最好。

以上是关于PHP 在类函数中使用 $_SESSION 变量作为默认值的主要内容,如果未能解决你的问题,请参考以下文章

PHP学习笔记:删除与销毁session

PHP:$_SESSION - 在 $_SESSION 变量中存储临时使用的数据的优缺点是啥

设置 SESSION 变量的简单 AJAX 函数

为啥 PHP $_SESSION 变量在 header() 方法中使用时不起作用?

AngularJS ngRoute 和 PHP $_SESSION 变量

PHP 在多个页面中使用 SESSION