Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
Prestashop 在CLI脚本中使用Db::getInstance()_Prestashop - Fatal编程技术网

Prestashop 在CLI脚本中使用Db::getInstance()

Prestashop 在CLI脚本中使用Db::getInstance(),prestashop,Prestashop,我一直想创建一个附加cron脚本,该脚本使用Prestashop的DB类,而不是直接实例化数据库句柄,但我似乎不知道“DB::getInstance()”调用通常引用的“DB”类是在哪里定义的 classes/Db.php定义了一个抽象的DbCore类。正如您所看到的,MySQLCore扩展了Db,但是Db从未在任何地方定义过: [/home/xxxx/www/shop/classes]# grep -r "extends Db" ../ ../classes/MySQL.php:class M

我一直想创建一个附加cron脚本,该脚本使用Prestashop的DB类,而不是直接实例化数据库句柄,但我似乎不知道“DB::getInstance()”调用通常引用的“DB”类是在哪里定义的

classes/Db.php定义了一个抽象的DbCore类。正如您所看到的,MySQLCore扩展了Db,但是Db从未在任何地方定义过:

[/home/xxxx/www/shop/classes]# grep -r "extends Db" ../
../classes/MySQL.php:class MySQLCore extends Db
根据Prestashop论坛上的另一个线程,抽象DbCore类是在override/classes/db中的一个类中实现的,但是该目录不存在

[/home/xxxx/www/shop/override]# cd ../override/
[/home/xxxx/www/shop/override]# ls
./  ../  classes/  controllers/
[/home/xxxx/www/shop/override]# cd classes/
[/home/xxxx/www/shop/override/classes]# ls
./  ../  _FrontController.php*  _Module.php*  _MySQL.php*
我们的店在营业,所以很明显我错过了一些东西。我们正在运行Prestashop 1.4.1,因此这些文档可能不再适用

很明显,在代码的许多地方,都在使用Db类的函数,但最后一次grep在代码中没有发现任何东西:

grep -rwI "Db" . | grep -v "::"
./modules/productcomments/productcommentscriterion.php:require_once(dirname(__FILE__).'/../../classes/Db.php');
./classes/MySQL.php:class MySQLCore extends Db
./classes/Db.php:  * Get Db object instance (Singleton)
./classes/Db.php:  * @return object Db instance
./classes/Db.php:  * Build a Db object

我有什么遗漏吗?这个神奇的Db类是从哪里来的?

您对此有点困惑。在PS 1.4.x中。在覆盖目录中,不分配任何文件。文件遵循PS 1.5.x

PS正在使用自动加载功能加载类。让我们以DB类为例。文件名是Db.php,但类名是DbCore,当我们想要获取Db类的对象时,我们会像

Db::getInstance(); 
意思是不喜欢

 DbCore::getInstance(); 
这是怎么回事?关键是php自动加载函数。签出config/autoload.php(或具有类似名称的文件),您将看到PS在类名的末尾检查带有和不带Core的类。这意味着,如果a名称有或没有核心,将加载它

从PS 1.5.x开始,PS放置在override/classes文件夹中的RIDE文件上。请注意,所有这些类都在扩展各自的类。例如,在override/classes/db中放置了类db.php,该文件只有以下代码

<?php

  abstract class Db extends DbCore
  {

  }

要创建CLI脚本,最简单的方法是包含配置文件,这样您就可以访问每个类。比如说

<?php
    require dirname(__FILE__).'/config/config.inc.php'; // assuming your script is in the root folder of your site
    // you can then access to everything 
    $db = Db::getInstance();