【问题标题】:Abstract function returning NULL instead of a string - PHP OOP返回 NULL 而不是字符串的抽象函数 - PHP OOP
【发布时间】:2019-09-04 22:00:27
【问题描述】:

我有这个处理session_startsession_regenerate_id 函数的SessionService.php 文件。

我使用了一个抽象类来生成一个新的会话 ID 并将它存储在一个名为 $new_session_id 的变量中。然后我将此变量作为名为@9​​87654324@ 的抽象函数的参数返回,该函数包含在SessionRegenerateID 类中。这个抽象函数旨在返回变量$new_session_id

这就是问题所在。 它不返回字符串(我们生成的新会话 ID),而是返回 NULL。

createNewID(),您会看到我正在将新生成的代码分配给名为$_SESSION['new_session_id'] 的会话变量。通过回显这个会话变量,我得到了期望值。同时,回显createNewID() 函数的返回值给了我NULL

正在生成 ID。问题很可能在于这个变量$new_session_id 在这些函数中的使用方式。我需要弄清楚为什么抽象函数没有返回它。

SessionService.php

interface SessionRegenerateInterface {

        public function createNewID();
        (... other unrelated functions ...)

}

abstract class AbstractSessionRegenerate implements SessionRegenerateInterface {

        public function createNewID() {
            $new_session_id = session_create_id();
            $_SESSION['new_session_id'] = $new_session_id;
            $this->returnNewSessionID($new_session_id);
        }

        abstract protected function returnNewSessionID($newID);

}

class SessionRegenerateID extends AbstractSessionRegenerate {

        protected function returnNewSessionID($newID) {
            return $newID;
        }

}

SessionController.php

$RegenerateSession = new SessionRegenerateID;
$newID = $RegenerateSession->createNewID();
var_dump($newID);    // outputs NULL
var_dump($_SESSION['new_session_id']);    // outputs the generated session ID

我有一个 InputValidation 类,它在逻辑上与这个类相同,除了它返回的值类型:TRUE 或 FALSE。有用。但是现在我正在传递一个带有字符串值的变量,它返回 NULL。感谢您帮助理解原因。

【问题讨论】:

  • AbstractSessionRegenerate::createNewID 不返回任何内容。在$this->returnNewSessionID($new_session_id); 之前添加return 应该会有所帮助:)
  • 谢谢。有用。这么简单的事情:) 所以当我们返回的值是布尔值时,似乎不需要返回。正如我在问题末尾所说,我有另一个返回布尔值的抽象类,它可以在没有返回的情况下工作

标签: php function class oop abstract-class


【解决方案1】:

感谢 Jeto,我通过在 $this->returnNewSessionID($new_session_id); 之前插入“返回”解决了这个问题

        public function createNewID() {
            $new_session_id = session_create_id();
            $_SESSION['new_session_id'] = $new_session_id;
            return $this->returnNewSessionID($new_session_id);
        }

【讨论】:

  • 布尔值与否无关紧要。如果您不使用return,您的函数将不会返回任何内容(或者更准确地说,它将始终返回null)。
  • 我很确定在不使用return 的情况下返回布尔值。这就是我进行 InputValidation 的方式,我对此进行了确认。甚至还有一个例子,返回的值甚至不是布尔值:See the render() function inside the abstract class,所以也许我们都错过了什么......?
  • @Doug 如果你想让你的函数返回一些东西,你必须使用return关键字。否则,它将返回NULL3v4l.org/5rUU1
  • @Doug 该示例中的render() 函数不返回任何内容,它使用echo 将一些内容写入输出。不是一回事。请注意,该值不会被检索到任何变量中。
  • 我再次在我的代码上运行 var_dump() 没有“返回”,输出为 NULL。我发誓它确实用相同的代码返回了 bool(true) 或 bool(false)。也许是 opcache 的缓慢重新验证频率。我真的很惊讶这次没有成功。谢谢你的信息,我编辑了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多