rfc:traits

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
rfc:traits [2008/03/06 21:15] – created gronrfc:traits [2017/09/22 13:28] (current) – external edit 127.0.0.1
Line 1: Line 1:
-====== Request for Comments: Traits for PHP ======+====== Request for Comments: Traits for PHP (Superseded by Horizontal Reuse for PHP) ====== 
   * Version: 1.5   * Version: 1.5
 +  * Date: 2008-03-06
 +  * Author: Stefan Marr <php.at.stefan-marr.de>
 +  * Status: **Superseded by [[rfc:HorizontalReuse|Horizontal Reuse for PHP]]**
 +  * Patch: http://www.stefan-marr.de/archives/20-New-Traits-Patch-Ready-for-Testing.html
   * First Published at: http://www.stefan-marr.de/artikel/rfc-traits-for-php.html   * First Published at: http://www.stefan-marr.de/artikel/rfc-traits-for-php.html
   * reST TXT: http://www.stefan-marr.de/rfc-traits-for-php.txt   * reST TXT: http://www.stefan-marr.de/rfc-traits-for-php.txt
-  * Author: Stefan Marr <php.at.stefan-marr.de> 
  
 This RFC will discuss at first the motivation for Traits describing the rationals This RFC will discuss at first the motivation for Traits describing the rationals
Line 11: Line 15:
 additional resources about Traits are given. additional resources about Traits are given.
  
 +**This RFC is outdated and replaced by [[rfc:HorizontalReuse|RFC: Horizontal Reuse for PHP]].**
 ===== Introduction ===== ===== Introduction =====
  
Line 104: Line 109:
 The next sections will discuss on more advanced techniques and describe how the The next sections will discuss on more advanced techniques and describe how the
 current implementation of Traits for PHP works. current implementation of Traits for PHP works.
 +
  
 ==== The Flattening Property ==== ==== The Flattening Property ====
Line 259: Line 265:
  class Talker {  class Talker {
    use A, B {    use A, B {
-     B::smallTalk instead A::smallTalk, +     B::smallTalk instead A; 
-     A::bigTalk instead B::bigTalk+     A::bigTalk instead B;
    }    }
  }  }
Line 275: Line 281:
  class Talker {  class Talker {
    use A, B {    use A, B {
-     B::smallTalk instead A::smallTalk,  +     B::smallTalk instead A 
-     A::bigTalk instead B::bigTalk, +     A::bigTalk instead B; 
-     A::bigTalk as talk+     A::bigTalk as talk;
    }    }
  }  }
Line 290: Line 296:
 class will consist of following three methods: class will consist of following three methods:
  
-* ''bigTalk() { echo 'A'; }'' +  * ''bigTalk() { echo 'A'; }'' 
-* ''smallTalk() { echo 'b'; }'' +  * ''smallTalk() { echo 'b'; }'' 
-* ''talk() { echo 'B'; }''+  * ''talk() { echo 'B'; }''
  
 Since the alias operation adds a new name to an existing method body, the Since the alias operation adds a new name to an existing method body, the
Line 498: Line 504:
  
 This section collects proposals for alternative Traits syntaxes. This section collects proposals for alternative Traits syntaxes.
 +
 +==== Scala Synthax and practical example ====
 +
 +This is inpired from [[http://www.scala-lang.org/node/117]].
 +
 +<code php>
 +trait User_Comments 
 +{
 +     function addComment($c)
 +     {
 +           $db = App::getDb();   
 +           $db->Execute("INSERT INTO user_comments (type, type_id, user_id, text)VALUES ($c->type, $c->type_id, $c->uid, $c->text)");
 +     }
 +
 +     function getComments($filter)
 +     {
 +           return array();
 +     }
 +
 +     function removeComment($id)
 +     {
 +           $db = App::getDb();   
 +           $db->Execute("DELETE FROM user_comments ... ");
 +     }
 +}
 +
 +class App_Email with User_Comments {}
 +
 +class App_Document with User_Comments  {
 +
 +     function removeComment($id)
 +     {
 +           $db = App::getDb();   
 +           $db->Execute("DELETE FROM user_comments ... ");
 +
 +           $db->Execute("UPDATE app_documents SET comments_count = ... ");
 +     }
 +}
 +// PHP notice : 'User_Comments::removeComment() definition skipped in App_Document'
 +
 +$doc = new App_Document;
 +
 +echo is_a($doc, 'App_Document');     // true
 +echo is_a($doc, 'User_Comments');    // false
 +echo is_with($doc, 'User_Comments'); // true
 +</code>
 +
 +We deal with conflicting class definitions by simply ignoring them.
 +
 +<code php>
 +trait Conflict_Comments 
 +{
 +     function removeComment($id)
 +     {
 +           return false;
 +     }
 +}
 +
 +class App_Document_Conflict with User_Comments, Conflict_Comments  {
 +
 +     function removeComment($id)
 +     {
 +           $db = App::getDb();   
 +           $db->Execute("DELETE FROM user_comments ... ");
 +
 +           $db->Execute("UPDATE app_documents SET comments_count = ... ");
 +     }
 +}
 +// PHP notice : 'User_Comments::removeComment() definition skipped in App_Document_Conflict'
 +// PHP notice : 'Conflict_Comments::removeComment() definition skipped in App_Document_Conflict'
 +
 +$doc = new App_Document_Conflict;
 +
 +echo is_a($doc, 'App_Document_Conflict');// true
 +echo is_with($doc, 'User_Comments');     // true
 +echo is_with($doc, 'Conflict_Comments'); // true
 +</code>
  
 === Alternative Keywords for use === === Alternative Keywords for use ===
Line 680: Line 763:
 Last but not least, in this Phd thesis http://www.iam.unibe.ch/~scg/Archive/PhD/schaerli-phd.pdf Last but not least, in this Phd thesis http://www.iam.unibe.ch/~scg/Archive/PhD/schaerli-phd.pdf
 two case studies have been publish illustrating the benefits Traits are providing. two case studies have been publish illustrating the benefits Traits are providing.
 +
  
 ===== Changelog ===== ===== Changelog =====
  
-gron 2008-03-05 14:15:45+gron 2008-03-05 14:15:45\\ 
 - added new style of traits composition and replaced the notion of an explicit exclude operator in favor for a very explicit conflict resolution - added new style of traits composition and replaced the notion of an explicit exclude operator in favor for a very explicit conflict resolution
  
-gron 2008-02-25 16:08:35+gron 2008-02-25 16:08:35\\ 
 - fixed version number and some typos - fixed version number and some typos
  
-gron 2008-02-23 18:57:21 +gron 2008-02-23 18:57:21\\  
-- added an example to the aliasing vs renaming part illustrating the effect on recursion+- added an example to the aliasing vs renaming part illustrating the effect on recursion\\ 
 - added a syntax proposal which expresses the opposing character of aliasing(add) and excluding(remove) very well - added a syntax proposal which expresses the opposing character of aliasing(add) and excluding(remove) very well
  
-gron 2008-02-21 23:02:01 +gron 2008-02-21 23:02:01\\  
-- added several new notation proposals+- added several new notation proposals\\ 
 - added link to patch for PHP_5_3 - added link to patch for PHP_5_3
  
-gron 2008-02-20 18:47:17 +gron 2008-02-20 18:47:17\\  
-- introduced explicit description of abstract methods to be used as requirements specification for traits (useful to access state) +- introduced explicit description of abstract methods to be used as requirements specification for traits (useful to access state)\\  
-- moved part about interface propagation to the section of rejected features +- moved part about interface propagation to the section of rejected features\\  
-- added a section about common misconceptions i.e. aliasing is not renaming+- added a section about common misconceptions i.e. aliasing is not renaming\\ 
 - added various syntax proposals - added various syntax proposals
rfc/traits.1204838144.txt.gz · Last modified: 2017/09/22 13:28 (external edit)