【问题标题】:PHP use $_SESSION variable as default in class functionPHP 在类函数中使用 $_SESSION 变量作为默认值
【发布时间】: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']) {

    }

}
?>

【问题讨论】:

    标签: php class default


    【解决方案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。
      • 顺便说一句,我的帖子有点跑题了,这个问题你的回答最好。
      猜你喜欢
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 2020-11-27
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多