Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在脚本中使用类方法_Php_Opencart - Fatal编程技术网

Php 在脚本中使用类方法

Php 在脚本中使用类方法,php,opencart,Php,Opencart,我有一个脚本文件,名为99bill\u received.php 在该脚本中,我需要在名为ModelCheckoutOrder的类中调用方法update(),该类位于与此PHP脚本不同的路径中 update()方法所在的类名称为ModelCheckoutOrder 对于大多数OpenCart扩展,PHP文件都是类文件,因此您可以在不初始化对象的情况下调用类似的内容 /** * Updates an existing order history using the order_id and th

我有一个脚本文件,名为
99bill\u received.php

在该脚本中,我需要在名为
ModelCheckoutOrder
的类中调用方法
update()
,该类位于与此PHP脚本不同的路径中

update()
方法所在的类名称为
ModelCheckoutOrder

对于大多数OpenCart扩展,PHP文件都是类文件,因此您可以在不初始化对象的情况下调用类似的内容

/**
 * Updates an existing order history using the order_id and the updated
 * order_status
 * @param $order_id
 * @param $order_status
 */
function update_order_history($order_id, $order_status)
{
    // load the order.php file
    $this->load->model('checkout/order');

    // Execute update()
    $this->model_checkout_order->update(
        $order_id,
        $order_status,
        "",
        true
    );
}
请注意
$this->load->model()
行。您不需要初始化
ModelCheckoutOrder
对象就可以使用它(如果我在这方面有错误,请纠正我)

我的问题是-如何在PHP脚本文件中访问这个类方法?我现在不在OpenCart
.php
脚本中-只调用它,因为我需要访问函数
update()
,它是一个OpenCart文件


我尝试使用
$model=new modelscheckoutorder()
初始化
modelscheckoutorder
类,但它没有按照我的预期工作(也就是说,我不知道什么是对的还是错的)。请原谅我对OOPHP的无知。

在opencart中使用以下结构是最好的

用于加载ModelCheckoutOrder类

$this->load->model('checkout/order');

$this->model_checkout_order->update(
        $order_id,
        $order_status,
        "",
        true
    );

首先-为什么您的文件只是一个脚本?OpenCart是使用MVC模式构建的,因此,即使您的脚本也应该是一个控制器,如下所示:

class ControllerPayment99BillReceived extends Controller {

    public function callback() {
        if ($this->request->server['REQUEST_METHOD'] === 'POST' && isset($this->request->post['order_id'])) {
            $this->update_order_history($this->request->post['order_id'], <ORDER_STATUS_ID>);
        }
    }

    private function update_order_history($order_id, $order_status) {
        // load the order.php file
        $this->load->model('checkout/order');

        // Execute update()
        $this->model_checkout_order->update($order_id, $order_status, "", true);
    }
}
http://example.com/index.php?route=payment/99bill_received/callback
而必要的值是通过POST请求传输的。当然,应该有更多的变量,并进一步验证该请求是作为来自支付网关的响应而来的,这样攻击者就不会滥用该请求

第二,对于大多数OpenCart扩展,PHP文件都是类文件,不幸的是这是真的。我的意思是,有些情况下,扩展附带脚本而不是控制器(从而破坏了MVC)。但这是一个坏习惯,缺乏经验/专业性

因此,为了回答您的(隐藏的)问题:如果您在OpenCart的MVC(控制器或模型)中,您可以访问OpenCart的IoC(控制反转)实现-到注册表-从中可以获得其他系统对象(客户、税务、货币等)或模型(通过加载它们)

所以你可以打电话

$this->load->model('checkout/order');
但您必须在控制器内部(即扩展基本
控制器

编辑回答以下问题:

  • 我的错误是,
    回调
    应该在URL中,并且在请求过程中将调用此回调(已更改URL示例)
  • 您可以有两个控制器,也可以只有一个控制器(就像在所有支付模块中一样)。在一个控制器案例中,您拥有为主要功能调用的方法
    index
    ,以及为来自支付网关的响应调用的方法
    callback
    (可以在成功支付后调用,也可以在发生错误的情况下调用-但是您应该在那里处理所有案例)
  • 虽然看起来情况并非如此。PHP没有像Java那样一直被调用的
    main
    方法。但是在许多MVC框架中(我们现在可以考虑OpenCART作为一个框架,即使它不是),它的实现方式是,如果您对一个没有显式动作(方法)定义的URL进行请求(至少必须是控制器),则该框架试图调用(执行)该控制器上的<代码>索引< /代码>方法。

  • 我不知道,它是否对您有帮助,但请检查一下:这与我的示例中的代码完全相同。我现在的问题是在课外打电话。我不太清楚该如何表达。非常感谢shadyyx。你完全回答了我的问题。这是真的,这确实是因为我对脚本vs.MVC的失败缺乏经验。我现在要做这些更改。您能给我解释一下
    callback()
    的用途吗?另外,我的第二个问题是-对于这个99Bill扩展,在同一个类中有两个
    Controller
    文件可以吗?我有一个
    bill99.php
    Controller文件,它执行扩展的主要功能。这个
    received.php
    只有在成功的事务之后才会被调用。第三个问题-
    index()
    函数是否是
    main()
    函数的Java等价物?请查看我编辑的答案,在那里你可以找到你的问题的答案。Man Shadyyyx-非常感谢你。我在为OpenCart开发时遇到了一些问题,因为我对一些设计模式概念不太清楚,而您为我解决了所有这些问题。