我正在开发一个插件,用于将额外的支付提供商“挂钩”到一个结账系统。
我的函数中有一个类gtpCheckoutData。计算价格的php。
在我的插件中,我想使用这个类中的数据,但如果这样做,我会得到:
Fatal error: Class gtpCheckoutData not found in
我的插件代码:
class gtpMollieGateway {
private $mollie, $price;
function __construct() {
$this->mollie = new Mollie_API_Client;
// THIS IS THE PROBLEM
$this->price = new gtpCheckoutData;
add_action( \'init\', array( $this, \'gtpCreatePayment\' ) );
}
function gtpCreatePayment() {
if( isset( $_POST[\'checkout_submit\'] ) ) {
$payment = $this->mollie->payments->create(array(
\'amount\' => $this->price->getPrice( \'inclusive\' ),
));
header( "Location: " . $payment->getPaymentUrl() );
}
}
}
函数中的My类。php
class gtpCheckoutData {
private $tax, $price;
public function __construct() {
$this->tax = get_gtp_option( \'gtp_tax\' ) / 100;
$this->price = $_SESSION[\'shopping_cart\'][\'total_price\'] + $_SESSION[\'shopping_cart\'][\'shipping_price\'];
$this->shipping = $_SESSION[\'shopping_cart\'][\'shipping_price\'];
}
public function getPrice( $type ) {
if( isset( $type ) ) {
switch( $type ) {
case \'exclusive\' :
$totalPrice = $this->price;
break;
case \'tax\' :
$totalPrice = $this->price * $this->tax;
break;
case \'inclusive\' :
$totalPrice = $this->price * ( $this->tax + 1 );
break;
}
return $totalPrice;
}
}
}
最合适的回答,由SO网友:SkyShab 整理而成
插件在函数之前加载。php。如果可能的话,应该在插件中包含该类。
我曾经有过这样的场景:一个类是主题的一部分,但也需要一个插件,在这个插件中,你不能假设这个类包含在主题中。在这些情况下,我只需在两个位置都包含该类,并将其包装在“类存在”检查中。
像这样:
if(!class_exists(\'My_Class\'))
{
class My_Class{
// Class Methods and Properties
}
}
您还可以在MU插件中只包含一次该类,它是在其他插件之前加载的。
SO网友:kaiser
插件在主题之前加载。插件可用的最早挂钩是plugins_loaded
(或muplugins_loaded
对于mu插件),而主题在after_setup_theme
以及后来的挂钩。因此,您最好将文件[包含类]加载到插件中的特定挂钩上。最好以比默认优先级更低的优先级加载它10
. 下面我使用5
使其可用于按默认优先级运行的回调。这对您的用户更安全,因为他们可能不会添加优先级,因此回调会在10
并且会(再次)抛出错误。
add_action( \'after_setup_theme\', function()
{
require plugin_dir_path( __FILE__ ).\'src/your-class.php`;
}, 5 );
然后,在你的主题中
functions.php
文件你可以仅仅依靠这个类。它还可以避免重复代码(并在两个地方维护),并且不需要不必要的
class_exists
只会降低性能的检查。此外,您的类在哪里可用并随时可用也是可以预测的。
请记住FIG PSR-4 standard 不允许每个文件有多个类(除此之外没有其他类)。这样做可以让您的设置更加经得起未来的考验,因为您的代码已经准备好了命名空间。(当前的PHP版本是5.6,5.3已经过时)。