我一直想创建一个使用Prestashop的DB类的附加cron脚本,而不是直接实例化数据库句柄,但我似乎无法弄清楚Db通常引用的“Db”类在哪里:: getInstance()“调用get defined。
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课程来自哪里?
答案 0 :(得分:1)
要创建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();
答案 1 :(得分:0)
你对此感到困惑。在PS 1.4.x.在覆盖目录中,没有文件被占用。该文档遵循PS 1.5.x.
PS正在使用自动加载功能来加载类。让我们以DB类为例。文件名是Db.php,但是类名是DbCore,当我们想得到Db类的对象时,我们就像
一样Db::getInstance();
表示不喜欢
DbCore::getInstance();
这是如何运作的?问题是php自动加载功能。检查config / autoload.php(或具有类似名称的文件),您将看到PS在类名末尾检查带有和没有Core的类。意味着如果名称具有Core或不具有Core,则将加载它。
从PS 1.5.x开始,PS将覆盖文件放在override / classes文件夹中。请注意,所有这些课程都在扩展各自的课程。例如,在override / classes / db中放置了类Db.php,该文件只有以下代码
<?php
abstract class Db extends DbCore
{
}
很明显,如果我们想要使用Db类,它将调用从DbCore类扩展的override / classes / db / Db.php。
对于所有其他类,同样使用相同的标准。
我希望这些细节能有所帮助。
谢谢