PHP Trait Override Protected Trait Method
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类的行为。
非常感谢任何帮助。
在你的类中,你可以这样做:注意函数名前面的T,你可以将其更改为任何别名。
use billable { updateSubscriptionsToPaymentMethod as tUpdateSubscriptionsToPaymentMethod; }
然后在类中添加所需的函数:
public function updateSubscriptionsToPaymentMethod(){ ... }
问题的原因是,当一个类使用了Trait,并在Trait中定义了一个受保护(protected)的方法,如果在使用Trait的类中也定义了同名的方法,那么Trait中的方法将被覆盖,无法被调用。
解决方法是,在使用Trait的类中使用Trait中方法的别名(alias)来重命名方法,以避免与类中已有的方法冲突。这样,Trait中的方法将不会被覆盖,仍然可以正常调用。
以上就是关于PHP Trait Override Protected Trait Method问题的出现原因和解决方法。