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

0

あなたはこれで少し混乱しています。PS 1.4.x では。override ディレクトリには、ファイルは配置されません。ドキュメントは PS 1.5.x に準拠しています。

PS は autoload 機能を使用してクラスをロードします。例としてDBクラスを見てみましょう。ファイル名は Db.php ですが、クラス名は DbCore で、Db クラスのオブジェクトを取得したい場合は次のようにします。

Db::getInstance(); 

好きではないという意味

 DbCore::getInstance(); 

これはどのように機能しますか?問題はphpのオートロード機能です。config/autoload.php (またはそのような名前のファイル) をチェックアウトすると、PS がクラス名の末尾にある Core の有無にかかわらずクラスをチェックすることがわかります。名前にコアが含まれているかどうかに関係なく、ロードされることを意味します。

PS 1.5.x から、PS は上書きされたファイルをオーバーライド/クラス フォルダーに配置しました。これらのクラスはすべて、それぞれのクラスを拡張していることに注意してください。たとえば、override/classes/db にはクラス Db.php が配置され、このファイルには次のコードのみが含まれます。

<?php

  abstract class Db extends DbCore
  {

  }

したがって、Db クラスを使用する場合は、DbCore クラスから拡張された override/classes/db/Db.php を呼び出すことは明らかです。

他のすべてのクラスについても同様に、同じ基準が使用されます。

それらの詳細が役立つことを願っています。

ありがとうございました

于 2013-05-14T07:22:25.797 に答える