当前位置:首页 > PHP专题 > 正文

如何在PHP框架里把Traits使用起来

12-11 PHP专题 原创


我们都知道,php只能使用单继承,也就是说一个类只能从另一个类中继承。例如,可能希望从几个不同的类继承方法,以防止代码重复。在 PHP 5.4 中 一个新的语言特性被添加进来,这就是众所周知的 Traits,它在 Laravel 框架中被广泛使用。

Traits 的定义
Trait 是单继承语言(如 PHP )中的一种代码复用机制。 Trait的目的是减少单继承语言的一些限制,能让开发者自由的重用在不同的类层次结构下几个独立类中的方法。

Trait 的语义组合与类的定义在某种程度上减少了代码的复杂度,避免了与多继承和 Mixins 相关的一些典型问题。

Trait 与类非常相似,但它的目的仅仅是用更好、一致的方式汇聚一些方法。 Trait 本身不能被实例化。除了传统继承之外,它能水平组合行为,换言之,类的应用程序不需要继承

PHP Traits是什么?
Trait 是一组简单的包含在另一个类中的方法。 Trait 就像一个抽象类一样,无法单独实例化。 一个 Trait 示例就像下面这样:

trait SharePost {
 public function share($item)
 {
  return 'share this post';
 }
}

然后,您可以在其他类中这样使用 Trait :
class Post {
 use SharePost;
}
class Comment {
 use SharePost;
}
  现在,如果您要从这些类中创建新对象,您会发现它们都可以使用 share() 方法:
$post = new Post;
echo $post->share(''); // 'share this post' 
$comment = new Comment;
echo $comment->share(''); // 'share this post'

Traits 如何工作 ?
从上面例子可以看到, 尽管 Post 和 Comment 本身没有定义方法,但是他们可以调用 share() 方法。 Trait 是运行时 「复制和粘贴」 代码的一种方式. 这意味着 Trait 被复制到 Post and Comment ,因此当你实例化一个新实例, 可以直接调用 share() 方法。 我会定期检查我的代码以及如何构造新代码,目的是为了将来可以快速构建新功能,并且可以轻松的开启新项目。

那么,怎样在laravel中使用traits呢?
首先我在项目的 Http 目录下创建一个Traits文件夹,并且新建了一个名叫 ActivityCouponTrait.php 的Trait文件,写了一个新用户注册的trait;去寻找UserBaseService里的addUser方法。
/**
 * Function:新用户注册
 * Author:磊丰
 * @param $user_name
 * @return mixed
 */
public function addUserTrait($user_name,$dealer,$source)
{
	$service =  app(UserBaseService::class);
	return $service->addUser($user_name,$dealer,$source);
}

接下来找UserBaseService里的addUser方法。
/**
 * 新增用户
 * @param string $user_name 手机号
 * @param int $dealer_id
 */
public function addUser($user_name, $dealer_id = '111', $source = '后台')
{
	$user            = new UserBaseModel;
	$user->user_name = $user_name;
	$user->zmq_no    = $this->zmq_no();
	$user->password  = md5(substr($user_name, -4));
	$user->source    = $source;
	$user->dealer_id = $dealer_id;
	$user->save();

	return $user;
}

这个时候我们就可以在controller里直接去调用了。首先要先引入上面的那个trait
use ActivityCouponTrait
然后就可以用了
/* Function:查找用户是否已经注册过
* Author:磊丰
* @param $mobile
* @return mixed
*/
public function addUser($mobile,$coupon)
{
$user = UserBaseModel::where('user_name',$mobile)->first();

//新用户领取
if(empty($user)){
	$source = '领取页';
	$user_new = $this->addUserTrait($mobile,'111',$source);   //用trait
	$res = $this->insertUserCoupon($user_new,$coupon);
}else{
	//用户注册过,查找一下是否领取过优惠券
	$userCoupon = $this->getUserCoupon($coupon,$user['user_id']);
	if($userCoupon != 1){
		$res = $this->insertUserCoupon($user,$coupon);
	}
}

return $res;
}


 

以上是本文的全部内容,希望对大家的学习有帮助,也希望大家多多支持 php自学中心 感谢阅读!