zoukankan      html  css  js  c++  java
  • php中traits学习笔记

    traits学习

    越来越多的框架和代码开始使用traits方式去组织一些功能,这是非常高效的代码组织结构。

    通过trait来减少不必要的类继承关系,让代码更加复用,形成可以拔插的代码集合。

    通过逗号分隔,在 use 声明列出多个 trait,可以都插入到一个类中。

    单个的例子:

    <?php
    
    trait Seller
    {
    	public function sell()
    	{
    	   print_r("sell all goods");		
    	}	
    }
    
    class MySeller
    {
    	use Seller;	
    }
    
    
    $seller = new MySeller();
    $seller->sell();
    

    多个trait的例子:

    <?php
    trait Money
    {
    	public function show()
    	{
    		echo "200$";
    	}
    }
    
    trait Factory
    {
    	public function run()
    	{
    		print_r("running all");
    	}
    }
    
    class User
    {
    	use Money, Factory;
    	
    	public function show()
    	{
    		echo "I am an user";
    	}
    } 
    
    $user = new User();
    $user->show(); // => I am an user
    

    当引入trait的类也有同名方法或者函数,那么当前类的该方法会覆盖trait中的同名方法。

    如上面这个例子中User类和Money trait都有show方法,则执行之后调用的是User类的show方法,打印出"I am an user"的内容。

    但是如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。我们需要明确指定是否某个trait的方法或者尽量不要让不同trait里面存在同名方法。

    1.使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。例如:

    <?php
    trait Token
    {
    	public function toString($var)
    	{
    		return (string)$var . "_token";
    	}
    	
    	public function tips()
    	{
    		print_r("Token tips!");
    	}
    }
    
    trait Tester
    {
    	public function toString($var)
    	{
    		return (string)$var . "_test";
    	}
    	
    	public function tips()
    	{
    		print_r("Tester tips");
    	}
    }
    
    class Controller
    {	
    	use Token, Tester {
    		Token::toString insteadof Tester;
    		Tester::tips insteadof Token;
    	}
    }
    
    $con = new Controller();
    $con->toString('hello');
    $con->tips('my god!');
    
    

    或者使用别名方式去避免同名问题,如:

    class Controller
    {
    	user Token, Tester {
    		Token::toString as toTokenString;
    		Tester::tips as testerTips;
    	}
    }
    
    

    以上都是一些理论案例,实际上一些优质和现代的php框架已经在使用trait方式组织整个代码。典型的就是laravel。比如/www/larblog/app/Http/Controllers/Controller.php:

    <?php
    
    namespace AppHttpControllers;
    
    use IlluminateFoundationBusDispatchesJobs;
    use IlluminateRoutingController as BaseController;
    use IlluminateFoundationValidationValidatesRequests;
    use IlluminateFoundationAuthAccessAuthorizesRequests;
    use IlluminateFoundationAuthAccessAuthorizesResources;
    
    class Controller extends BaseController
    {
        use AuthorizesRequests, AuthorizesResources, DispatchesJobs, ValidatesRequests;
    }
    

    这里就使用了四个trait.

  • 相关阅读:
    [LeetCode] 875. Koko Eating Bananas 科科吃香蕉
    [LeetCode] 874. Walking Robot Simulation 走路机器人仿真
    [LeetCode] 995. Minimum Number of K Consecutive Bit Flips 连续K位翻转的最小次数
    [LeetCode] 873. Length of Longest Fibonacci Subsequence 最长的斐波那契序列长度
    [LeetCode] 872. Leaf-Similar Trees 叶结点相似的树
    [LeetCode] 870. Advantage Shuffle 优势洗牌
    [LeetCode] 869. Reordered Power of 2 重新排序为2的倍数
    [LeetCode] 868. Binary Gap 二进制间隙
    [LeetCode] 867. Transpose Matrix 转置矩阵
    [LeetCode] 866. Prime Palindrome 质数回文数
  • 原文地址:https://www.cnblogs.com/freephp/p/5428046.html
Copyright © 2011-2022 走看看