Prestashop 在CLI脚本中使用Db::getInstance()
我一直想创建一个附加cron脚本,该脚本使用Prestashop的DB类,而不是直接实例化数据库句柄,但我似乎不知道“DB::getInstance()”调用通常引用的“DB”类是在哪里定义的 classes/Db.php定义了一个抽象的DbCore类。正如您所看到的,MySQLCore扩展了Db,但是Db从未在任何地方定义过: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
[/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();