PHP Trait Override Protected Trait Method

7 浏览
0 Comments

PHP Trait Override Protected Trait Method

我遇到了一个与composer包相关的问题。它实现了一个特性Billable。

trait Billable
{
    /**
     * 更新用户所有订阅的付款方式令牌。
     *
     * @param  string  $token
     * @return void
     */
    protected function updateSubscriptionsToPaymentMethod($token)
    {
        foreach ($this->subscriptions as $subscription) {
            if ($subscription->active()) {
                BraintreeSubscription::update($subscription->braintree_id, [
                    'paymentMethodToken' => $token,
                ]);
            }
        }
    }
}

我尝试在我的类中重写这个方法。

class Organisation extends Model
{
    use Billable;
    /**
     * 更新用户所有订阅的付款方式令牌。
     *
     * @param  string  $token
     * @return void
     */
    protected function updateSubscriptionsToPaymentMethod($token)
    {
        foreach ($this->subscriptions as $subscription) {
            if ($subscription->active()) {
                BrntreeSubscription::update($subscription->braintree_id, [
                    'paymentMethodToken' => $token,
                ]);
            }
        }
    }
}

但是这个方法没有被重写。我尝试重写了一些公共函数,它们工作得很好,这是特性的限制吗?我尝试在网上找到答案,但没有找到。

我尝试重写这个函数是因为我需要自定义BraintreeSubscription类的行为。

非常感谢任何帮助。

0
0 Comments

在你的类中,你可以这样做:注意函数名前面的T,你可以将其更改为任何别名。

use billable {
    updateSubscriptionsToPaymentMethod as tUpdateSubscriptionsToPaymentMethod;
}

然后在类中添加所需的函数:

    public function updateSubscriptionsToPaymentMethod(){
      ...
   }

问题的原因是,当一个类使用了Trait,并在Trait中定义了一个受保护(protected)的方法,如果在使用Trait的类中也定义了同名的方法,那么Trait中的方法将被覆盖,无法被调用。

解决方法是,在使用Trait的类中使用Trait中方法的别名(alias)来重命名方法,以避免与类中已有的方法冲突。这样,Trait中的方法将不会被覆盖,仍然可以正常调用。

以上就是关于PHP Trait Override Protected Trait Method问题的出现原因和解决方法。

0