Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: $this->metoda()-> i cos jeszcze ...
Forum PHP.pl > Forum > PHP
xbitdesigns
Czesc.

Co to jest:

  1. <?php
  2. $this->blah()->smash();
  3. ?>


a moze powinno byc:

  1. <?php
  2. $this->blah()->$this->smash();
  3. ?>


Jak to sie nazywa, bo nawet chcac w google znalezc nie wiem czego szukac worriedsmiley.gif
mike
Cytat(xbitdesigns @ 4.04.2008, 21:17:47 ) *
Co to jest:
  1. <?php
  2. $this->blah()->smash();
  3. ?>
Taka konstrukcja nazywa się Fluent Interfaces.
Jest to sposób kodowania polegający na tym że jedna funkcja klasy zwraca instancję klasy z której została wywołana dzięki temu możesz kontynuować wykonywanie funkcji dalej.
Mona dzięki temu osiągnąć bardzo wygodne rzeczy. Na przykład w Doctrine możesz robic tak:
  1. <?php
  2.  
  3. $query = Doctrine_Query::create()
  4. ->from('User u')
  5. ->leftJoin('u.Group g')
  6. ->orderby('u.username ASC');
  7.  
  8. // ...
  9.  
  10. ?>


Więcej poczytasz tutaj: Fluent Interfaces in PHP
W jednym z ostatnich php|archtectów był też ciekawy artykuł: Are fluent interfaces useful?
xbitdesigns
Thanks Mike.

Zmienilem opis tematu, bo moze ktos bedzie tego szukal.

Milego dnia snitch.gif

--

Przyklad uzycia:

  1. <?php
  2. class foo
  3. {
  4. public function bar()
  5.  {
  6. echo 'Bar';
  7. return $this;
  8.  }
  9.  
  10. public function one()
  11.  {
  12. echo 'one';
  13. return $this;
  14.  }
  15.  
  16. public function two()
  17.  {
  18. echo 'two';
  19. return $this;
  20.  }
  21. }
  22.  
  23. $x = new foo;
  24. $x->bar()->one()->two();
  25. ?>


Kazda metoda musi zwracac obiekt, i na tymze zwroconym obiekcie zostanie odpalona nastepna metoda. Tutaj zwracamy $this. Tak ogolnie to opisalem, gdyz nadal zglebiam temat smile.gif)
l0ud
Witam. Dołączę się do tematu. Bardzo podoba mi się ta metoda, jednak nie wiem jak ją zaimplementować. W powyższym przykładzie wszystko jest oczywiste, bo funkcje używają tylko echo, ale gdy ma istnieć jakaś zależność pomiędzy nimi wszystko się komplikuje.

Chcę napisać klasę generującą zapytania sql i używać jej w przybliżeniu tak:

  1. <?php
  2. $query = $queryGen->select('column')->form('table');
  3. ?>


Co w tym przypadku zostanie przypisane do zmiennej $query? Wartość ostatniej funkcji? Jeżeli tak, to musiałbym to chyba rozwiązać w taki sposób:
  1. <?php
  2. class queryGenerator {
  3.  private $actQuery='';
  4.  public function makeQuery() {
  5. $actQuery = $this->actQuery;
  6. $this->actQuery = '';
  7. return $actQuery;
  8.  }
  9.  public function select($select) {
  10. $this->actQuery .= 'SELECT '.$select;
  11. return $this;
  12.  }
  13.  //itd itd
  14. }
  15. ?>


i wywoływać tak

  1. <?php
  2. $queryGen = new queryGenerator();
  3. $query = $queryGen->select('column')->from('table')->makeQuery();
  4. ?>

Pisałem przed chwilą jako przykład, nie wiem czy działa smile.gif

Czy dobrze myślę? Jest może jakieś prostsze rozwiązanie?

Bardzo proszę o odpowiedź
Pozdrawiam
matix
@l0ud: dobrze myślisz. Skoro tak jesteśmy przy Fluent Interface, to pokażę Wam moją klasę SQL z wykorzystaniem tego:

  1. <?
  2.  
  3. abstract class Db_Table {
  4.  
  5.  
  6.  
  7. protected $_Name = null;
  8.  
  9. private $__Db;
  10.  
  11.  
  12.  
  13. public function __construct($sConnectionName = null, $sDbConfig = 'database')
  14.  
  15. {
  16.  
  17. if ($this->_Name == null)
  18.  
  19. throw new exception ('Db_Table did not get table name, set $this->_Name');
  20.  
  21.  
  22.  
  23. $oConfig = new Config_Php($sDbConfig);
  24.  
  25.  
  26.  
  27. if ($sConnectionName)
  28.  
  29. $aConfig = $oConfig->$sConnectionName;
  30.  
  31. else
  32.  
  33. $aConfig = $oConfig-> { $oConfig->set_default_connection };
  34.  
  35.  
  36.  
  37. $this->__Db = new mysqli ($aConfig['host'], $aConfig['user'], $aConfig['password'], $aConfig['database']);
  38.  
  39. }
  40.  
  41.  
  42.  
  43. public function get($mFields = true)
  44.  
  45. {
  46.  
  47. if (is_array($mFields))
  48.  
  49. $sFields = join(', ', $mFields);
  50.  
  51.  
  52.  
  53. if(is_string($mFields))
  54.  
  55. $sFields = $mFields;
  56.  
  57.  
  58.  
  59. if (is_bool($mFields))
  60.  
  61. $sFields = '*';
  62.  
  63.  
  64.  
  65.  
  66.  
  67. $this->_sQuery = sprintf('SELECT %s FROM %s', $sFields, $this->_Name);
  68.  
  69.  
  70.  
  71. return $this;
  72.  
  73. }
  74.  
  75.  
  76.  
  77. public function execute($sQuery = null)
  78.  
  79. {
  80.  
  81. if ($sQuery == null)
  82.  
  83. $sQuery = $this->_sQuery;
  84.  
  85.  
  86.  
  87. $this->_rQuery = $this->__Db->query( $sQuery );
  88.  
  89.  
  90.  
  91. return $this;
  92.  
  93. }
  94.  
  95.  
  96.  
  97. public function fetchAll()
  98.  
  99. {
  100.  
  101. $rResult = $this->_rQuery;
  102.  
  103.  
  104.  
  105. while ($aRow = $rResult->fetch_assoc())
  106.  
  107. $aRows [] = $aRow;
  108.  
  109.  
  110.  
  111. return $aRows;
  112.  
  113. }
  114.  
  115.  
  116.  
  117. public function fetchOne()
  118.  
  119. {
  120.  
  121. $aRow = $this->fetchAll();
  122.  
  123. return $aRow[0];
  124.  
  125. }
  126.  
  127.  
  128.  
  129. public function join($where, $on, $method = 'LEFT')
  130.  
  131. {
  132.  
  133. $this->_sQuery .= sprintf(' %s JOIN %s ON %s', $method, $where, $on);
  134.  
  135.  
  136.  
  137. return $this;
  138.  
  139. }
  140.  
  141.  
  142.  
  143. public function where($sClause)
  144.  
  145. {
  146.  
  147. $this->_sQuery .= ' WHERE '.$sClause;
  148.  
  149.  
  150.  
  151. return $this;
  152.  
  153. }
  154.  
  155.  
  156.  
  157. public function limit($iOffset, $iMax)
  158.  
  159. {
  160.  
  161. $this->_sQuery .= ' LIMIT '.$iOffset.','.$iMax;
  162.  
  163.  
  164.  
  165. return $this;
  166.  
  167. }
  168.  
  169.  
  170.  
  171. public function group($sWhat)
  172.  
  173. {
  174.  
  175. $this->_sQuery .= ' GROUP BY '.$sWhat;
  176.  
  177.  
  178.  
  179. return $this;
  180.  
  181. }
  182.  
  183.  
  184.  
  185. public function like($sWhat, $sLike)
  186.  
  187. {
  188.  
  189. $this->_sQuery .= ' WHERE '.$sWhat.' LIKE '%'.$sLike.'%'';
  190.  
  191.  
  192.  
  193. return $this;
  194.  
  195. }
  196.  
  197.  
  198.  
  199. public function order($sWhat, $sOrder = 'ASC')
  200.  
  201. {
  202.  
  203. $this->_sQuery .= ' ORDER BY '.$sWhat.' '.$sOrder;
  204.  
  205.  
  206.  
  207. return $this;
  208.  
  209. }
  210.  
  211.  
  212.  
  213. public function insert($aArray)
  214.  
  215. {
  216.  
  217. $aKeys = implode(',', array_keys($aArray));
  218.  
  219. $aValues = implode('","', array_values($aArray));
  220.  
  221.  
  222.  
  223. $this->_sQuery = 'INSERT INTO '.$this->_Name.' ('.$aKeys.') VALUES ("'.$aValues.'")';
  224.  
  225.  
  226.  
  227. return $this;
  228.  
  229. }
  230.  
  231.  
  232.  
  233.  
  234.  
  235. /* Displays the Query */
  236.  
  237.  
  238.  
  239. public function query()
  240.  
  241. {
  242.  
  243. return $this->_sQuery;
  244.  
  245. }
  246.  
  247.  
  248.  
  249.  
  250.  
  251. }
  252.  
  253. ?>


Wzorowane na Zend_Db_Table, a bitttttt =)
Czasami sobie nawet z niej korzystam winksmiley.jpg

Pozdrawiam.
l0ud
Dzięki wielkie, na pewno się przyda winksmiley.jpg Wygląda na to, że mam nowe zajęcie na parę godzin: przebudować klasę generowania zapytań smile.gif

Pozdrawiam
Strzałek
Cytat(l0ud @ 6.04.2008, 22:32:25 ) *
Dzięki wielkie, na pewno się przyda winksmiley.jpg Wygląda na to, że mam nowe zajęcie na parę godzin: przebudować klasę generowania zapytań smile.gif

Pozdrawiam



Polecam użyć Doctrine aarambo.gif
mike
Cytat(Strzałek @ 7.04.2008, 16:30:32 ) *
Polecam użyć Doctrine aarambo.gif
A ja nie. Doctrine jest fajne ale kiepsko udokumentowane i zostaje w tyle daleko za Propelem jeśli chodzi o możliwości.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.