PHP 子 class 中的构造函数覆盖了父中的构造函数。所以父构造函数没有运行。打开购物车

PHP constructor in child class overwrites the one in parent. So parent constructor does not run. OpenCart

我正在从我们的程序向 OpenCart 进行网络导出。我正在尝试登录,但收到此错误消息:

PHP Fatal error: Call to a member function get() on null in /home/key2demo/domains/key2datafeed.com/public_html/ocdemoshops/oc23/system/engine/controller.php on line 10

我们发现子 class 中的构造函数覆盖了父中的构造函数。所以父构造函数没有 运行 也没有设置 this->registry.

控制器中的代码是:

<?php
    abstract class Controller {
        protected $registry;
    
        public function __construct($registry) {
            $this->registry = $registry;
        }
    
        public function __get($key) {
            return $this->registry->get($key);
        }
    
        public function __set($key, $value) {
            $this->registry->set($key, $value);
        }
    }

这是我编写的代码:

    define("VERSION", "1.0");
    define("LANGUAGE", "1");

    if (is_file('./../admin/config.php')) {
       require_once('./../admin/config.php');
    }

    require_once(DIR_SYSTEM . 'startup.php');

    $application_config = 'admin';
    $registry = new Registry();

    $loader = new Loader($registry);
    $registry->set('load', $loader);

    $config = new Config();
    $config->load('default');

    $config->load($application_config);
    $registry->set('config', $config);
    $registry->set('request', new Request());
    $response = new Response();

    $response->addHeader('Content-Type: text/html; charset=utf-8');
    $registry->set('response', $response);

    $registry->set('cache', new Cache($config->get('cache_type'), $config-
    >get('cache_expire')));
    $registry->set('url', new Url($config->get('site_ssl')));

    $language = new Language($config->get('language_default'));
    $language->load($config->get('language_default'));

    $registry->set('language', $language);
    $registry->set('document', new Document());

    $event = new Event($registry);
    $registry->set('event', $event);

    if ($config->get('db_autostart')) {
       $registry->set('db', new DB($config->get('db_type'), $config-
       >get('db_hostname'), $config->get('db_username'), $config-
       >get('db_password'), $config->get('db_database'), $config-
       >get('db_port')));
    }

    if ($config->get('session_autostart')) {
       $session = new Session();
       $session->start();
       $registry->set('session', $session);
    }

    if ($config->has('action_event')) {
       foreach ($config->get('action_event') as $key => $value) {
          $event->register($key, new Action($value));
       }
    }

    if ($config->has('config_autoload')) {
       foreach ($config->get('config_autoload') as $value) {
         $loader->config($value);
       }
    }

    if ($config->has('language_autoload')) {
       foreach ($config->get('language_autoload') as $value) {
          $loader->language($value);
        }
    }

    if ($config->has('library_autoload')) {
       foreach ($config->get('library_autoload') as $value) {
          $loader->library($value);
       }
    }

    if ($config->has('model_autoload')) {
       foreach ($config->get('model_autoload') as $value) {
          $loader->model($value);
       }
    }

    class K2P_API_OCWRITER extends Controller
    { 

       private $errors;
    private $admin;
    private $adminValidated;
    private $adminShops;
    
    public function __construct()
    {
        $this->errors = array();
    }

    public function doLog($message)
    {
        file_put_contents('./key2_log.txt', $message, FILE_APPEND);
    }
    
    public function login($usr, $pwd)
    {   
        
        if ($this->user->login($usr, $pwd)) {
            return true;
            $this->doLog('logged in');
        } else {
            $this->doLog('Failed to login, please supply a valid 
             username/password and check your webshop url');
            die;
        }
        
    }

    public function getLanguages()
    {
    }

    }

    $db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
    $registry->set('db', $db);
    $registry->set('user', new Cart\User($registry));
    $registry->set('tax', new Cart\Tax($registry));

    $myAPI = new K2P_API_OCWRITER($registry);
    $myAPI->config->set("config_language_id",LANGUAGE);
    $command = $myAPI->cleanPost($_POST['command']);
    $steps = $myAPI->cleanPost($_POST['steps']);
    $page = $myAPI->cleanPost($_POST['page']);
    $usr = $myAPI->cleanPost($_POST['usr']);
    $pwd = $myAPI->cleanPost($_POST['pwd']);
    //$myAPI->doLog(PHP_EOL . 'pages: ' . $page);
    //$myAPI->doLog(PHP_EOL . 'steps: ' . $steps);
    $totalProducts = $myAPI->getProductCount();
    if ($myAPI->checkInput($usr,$pwd,$command,$page,$steps)) {
       if ($myAPI->login($usr, $pwd)) {
           switch($command){
              case "getCategoryCount":
                  echo json_encode($myAPI->getCategoryCount(),JSON_FORCE_OBJECT 
                  | JSON_UNESCAPED_SLASHES);
                break;
            case "getProductCount";
                echo json_encode($myAPI->getProductCount(),JSON_FORCE_OBJECT | 
                JSON_UNESCAPED_SLASHES);
                break;
            case "getCategories":
                echo json_encode($myAPI->getCategories($steps, $page, 
                JSON_FORCE_OBJECT | JSON_UNESCAPED_SLASHES));
                break;
            case "getProducts":
                echo json_encode($myAPI->getProducts($steps, $page, 
                JSON_FORCE_OBJECT | JSON_UNESCAPED_SLASHES));
                break;
            default:
                echo "Invalid command!";
                break;
        }
     }
    }

如果我给它加上parent::__construct();。它仍然不起作用。我不知道我必须添加哪个,所以我都试过了。

当我像这样将 parent::__construct(); 添加到控制器时:

<?php
abstract class Controller {
    protected $registry;

    public function __construct($registry) {
        parent::__construct();
        $this->registry = $registry;
    }

    public function __get($key) {
        return $this->registry->get($key);
    }

    public function __set($key, $value) {
        $this->registry->set($key, $value);
    }
}

然后我收到此错误消息:

PHP Fatal error: Call to a member function get() on null in /home/key2demo/domains/key2datafeed.com/public_html/ocdemoshops/oc23/system/engine/controller.php on line 11

如果我像这样将它添加到我编写的代码中:

public function __construct()
{
    parent::__construct();
    $this->errors = array();
}

然后我收到以下错误消息:

PHP Warning: Missing argument 1 for Controller::__construct(), called in /home/key2demo/domains/key2datafeed.com/public_html/ocdemoshops/oc23/key2publish/k2p_api_OCwriter.php on line 95 and defined in /home/key2demo/domains/key2datafeed.com/public_html/ocdemoshops/oc23/system/engine/controller.php on line 5

PHP Notice: Undefined variable: registry in /home/key2demo/domains/key2datafeed.com/public_html/ocdemoshops/oc23/system/engine/controller.php on line 6

PHP Fatal error: Call to a member function get() on null in /home/key2demo/domains/key2datafeed.com/public_html/ocdemoshops/oc23/system/engine/controller.php on line 10

有谁知道如何解决这个问题?我想听听

谢谢!

您的 Controller class 的构造函数将 $registry 作为参数。所以当你调用Controller__construct时class,你需要这样调用:

parent::__construct($registry);

因此,K2P_API_OCWRITER 的构造函数 Controller 可以是:

class K2P_API_OCWRITER extends Controller
{
    public function __construct($registry)
    {
        // pass `$registry` to parent `__construct`
        parent::__construct($registry);
        $this->errors = array();
    }
}

并且实例化K2P_API_OCWRITER的对象仍然是:

$myAPI = new K2P_API_OCWRITER($registry);

顺便说一句,不需要在 Controller 构造函数中编写 parent::__construct();,因为它不扩展任何 classes,所以它没有父级。