آموزش Trait در Php

Image تحقیقات

آموزش Trait در Php

با سلام خدمت دوستان php کار.

خوبین؟

بحث امروز ما درباره ویژگی trait در زبان php است. trait ها یک مفهومی بودن که در php ورژن 5.4 معرفی شدن و به نظر من کاربرد اصلی اونها از بین بردن محدودیتی بود که کلاس های php با آن روبه رو بودن و اون محدودیت این بود که هر کلاس php فقط می توانست از یک کلاس مشتق بگیرد و نه بیشتر.

الان با استفاده از فراخانی یک trait در واقع میتونیم بگیم داریم ازیک کلاس ارت بری کنیم.

لازم هست بدونیم قبل از php ورژن 5.4  زبان php فقط از یک ارث بری از کلاس و ناحدود interface  طبعیت میکرد که با امدن trait این محدودیت از بین رفت.

 

نحوه استفاده از trait

برای ساخت یک trait در زبان php کافی است از کلمه کلیدی trait استفاده نماییم :

 trait first_trait
  {
    function first_method() { /* Code Here */ }
    function second_method() { /* Code Here */ }
  }

حالا می توانیم در داخل کلاس هامون از trait ای که ساختیم استفاده نماییم. برای این منظور باید از کلمه کلیدی trait و سپس نام trait مورد نظر استفاده کنیم :

class first_class
  {
    // Using the Trait Here
    use first_trait;
    
  }
  
  $obj = new first_class();
  
  // Executing the method from trait
  $obj->first_method(); // valid
  $obj->second_method(); // valid

 

  •  در خط  4 ام trait ای که در بالاتر ساختیم رو صدا و فراخانی کردیم.
  • در خط 11 و 12  متدهای داخل trait رو صدا زدیم.(دقیقا مانند ارث بری از کلاس)

 

استفاده از trait چندگانه

ما می توانیم در کلاس های خود از چندین trait استفاده نماییم و از این بابت هیچ محدودیتی نداریم.

trait first_trait
  {
    function first_method() { echo "method1"; }
  }
  
  trait second_trait
  {
    function second_method() { echo "method2"; }
  }

  class first_class
  {
    // now using more than one trait
    use first_trait, second_trait;
  }
  
  $obj= new first_class();
  
  // Valid
  $obj->first_method(); // Print : method1
  
  // Valid
  $obj->second_method(); // Print : method2
  •  همانطور که مشاهده می نمایید در خط 14 trait هامون رو صدا زدیم و در ادامه از توابع انها استفاده کردیم.

 

trait های تو در تو

نکته ی جالبی که هست اینه که در هر trait می توایم یک trait دیگر رو صدا کنیم  خیلی راحت.

trait first_trait
  {
    function first_method() { echo "method1"; }
  }
  
  trait second_trait
  {
    use first_trait;
    function second_method() { echo "method2"; }
  }

  class first_class
  {
    // now using 
    use second_trait;
  }
  
  $obj= new first_class();
  
  // Valid
  $obj->first_method(); // Print : method1
  
  // Valid
  $obj->second_method(); // Print : method2
  • در خط 8 اومدیم داخل second_trait یک trait دیگر رو صدا کردیم

 

استفاده از Abstract Methods در Trait ها

ما می توانیم در داخل trait هامون متدهای بدون بدنه (Abstract Methods) تعریف کنیم..در چنین شرایطی  کلاسی که از این trait استفاده می کنه حتما باید یک متد به همین نام به همراه بدنه داشته باشد.

  trait first_trait
  {
    function first_method() { echo "method1"; }
    // any class which use this trait must
    // have to implement below method.
    abstract public function second_method();
  }
  
  class first_method
  {
    use first_trait;
    
    function second_method()
    {
      /* Code Here */
    }
  }
  •  همانطور که مشاهده میکنید در خط  13 متد second_method را به همراه بدنه تعریف نمودیم.

 

 

 ناسازگاری (Conflicts) در trait ها

در مواقعی که شما از trait های متعددی در یک فایل استفاده می کنید ممکنه است بین متدهای آنها تداخلی پیش بیاید به این صورت که هر کدام متدهایی با نام یکسان داشته باشن..در این صورت ما باید با استفاده از insteadof مشخص کنیم کدام متد از کدام trait را لازم داریم.

 trait first_trait
  {
    function first_function() 
    { 
      echo "From First Trait";
    }
  }

  trait second_trait
  {
    function first_function() 
    { 
      echo "From Second Trait";
    }
  }

  class first_class
  {
    use first_trait, second_trait
    {
      // This class will now call the method
      // first function from first_trait only
      first_trait::first_function insteadof second_trait;
    }
  }  
  
  $obj = new first_class();
  // Output: From First Trait
  $obj->first_function();
  •  در خط 19 دو trait را صدا کردیم
  • در خط 23 با استفاده از insteadof بیان کردیم که متد مد نظر ما ، متد first_function از  first_trait می باشد.
  • در خط 29 هم متد first_function را صدا کردیم . در خط 23 گفتیم که متد first_function از کلاس first_trait اجرا شود.

با این روش این تداخل بین متدها رو از بین بردیم.

حالا اگر به هر دو متد در هر دو trait نیاز داشته باشیم.باید از as استفاده کنیم و به یکی از انها نام مستعار بدهیم و با استفاده از نام مستعار ، آن متد را صدا کنیم.

trait first_trait
  {
    function first_function() 
    { 
      echo "From First Trait";
    }
  }

  trait second_trait
  {
    function first_function() 
    { 
      echo "From Second Trait";
    }
  }

  class first_class
  {
    use first_trait, second_trait
    {
      // This class will now call the method
      // first function from first_trait only
      first_trait::first_function insteadof second_trait;
      
      
      // first_function of second_traits can be 
      // accessed with second_function
      second_trait::first_function as second_function;
      
    }
  }  
  
  $obj = new first_class();
  // Output: From First Trait
  $obj->first_function();
  
  // Output: From Second Trait
  $obj->second_function();

 

  •  در اینجا در خط 28 ام یک نام مستعار به متد first_function  که در second_trait است می دهیم.
  • در خط 38 با استفاده از آن نام مستعار ، متد را فراخانی می کنیم.

خب اینم از مبحث آموزش trait امیدوارم آشنایی پیدا کرده باشین باهاش

تا جلسه ی بعدی پیروز باشید.