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

时间:2013-05-14 02:04:07

标签: prestashop

我一直想创建一个使用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课程来自哪里?

2 个答案:

答案 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。

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

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

谢谢