0

我一直想创建一个使用 Prestashop 的 DB 类而不是直接实例化数据库句柄的附加 cron 脚本,但我似乎无法弄清楚“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 类是从哪里来的?

4

2 回答 2

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();
于 2013-05-14T09:18:28.113 回答
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,它就会被加载。

从 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。

类似地,对于所有其他类,使用相同的标准。

我希望这些细节会有所帮助。

谢谢

于 2013-05-14T07:22:25.797 回答