【问题标题】:Change class property value in method A and access updated value in method B更改方法 A 中的类属性值并访问方法 B 中的更新值
【发布时间】:2020-02-18 16:07:21
【问题描述】:

我正在使用主要基于 CodeIgniter 的自定义 PHP 框架。

在我的一个控制器文件中,我设置了一个名为 $orderId 的类属性。用户填写表格并提交后,我将进行数据库插入,获取订单号。并使用该订单号覆盖 $orderId 类属性值。

然后我将重定向到我想要访问更新后的 $orderId 类属性值的提交页面。这最后一部分不起作用,提交类获取属性 $orderId 的空白值。

请问我哪里错了?下面的基本示例。也许由于重定向我不能这样做,应该改用会话变量?

谢谢!

[EDIT] 或者我可以将 orderId 作为重定向中的第三个 URL 参数传递。例如。 redirect('orders/submit/'.self::$orderId); 在这种情况下,我会将所有 self:: 实例转换为 $this-> 以用于类级别范围。

class Orders extends Controller {
    private static $orderId;

    public function __construct() {
        // assign db model
    }

    public function index() {
        if($_SERVER['REQUEST_METHOD'] == 'POST') {

            $data = [
                // form data to pass to db model
            ];

            self::$orderId = 12345; // example order no. return from db model
            if(!empty(self::$orderId)) {
                redirect('orders/submit');
            }
        }
    }

    public function submit() {
        $data = [
            'orderId' => self::$orderId
        ];
        $this->view('orders/submit', $data);
    }
}

【问题讨论】:

  • 这个问题本身就是一个基本的架构问题。 static 仅在您使用同一实例时才有效。但是由于您正在重定向,因此框架正在重新初始化。失去静态财产的价值。执行此操作的最佳方法是将订单 ID 存储在会话变量中,然后读取该变量。只要浏览器窗口打开,会话就会持续。
  • @ProSamHDx 谢谢。是的,我已经走了会话变量路线。我尝试将 orderId 添加为第三个 URL 参数的一部分,效果很好,但我不喜欢该解决方案,因为用户可以修改该参数并且输出页面会相应更改。虽然它不会在数据库中添加任何新内容,但让用户像这样乱搞输出页面看起来很不专业。

标签: php scope class-properties


【解决方案1】:

这个问题本身就是一个基本的架构问题。 static 仅在您使用同一实例时才有效。但是由于您正在重定向,因此框架正在重新初始化。失去静态财产的价值。执行此操作的最佳方法是将订单 ID 存储在会话变量中,然后读取该变量。只要浏览器窗口打开,会话就会持续

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多