Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: przekazywanie metody prywatnej przez funkcję
Forum PHP.pl > Forum > PHP
kayman
jest to odpowiednik formatowania dla DataTables wywołujący klasę robiąca to samo co SSP

napisałem odpowiednik klasy SSP by po pierwsze móc ja rozszerzyć o bardziej skomplikowane zapytania sql (problem z left join) a po drugie mam własny sqlHelper

przykładowy formater wersja robocza nie do krytyki smile.gif
  1.  
  2. use Framework\Ajax\Master\Response;
  3. use Framework\Models\ModelDatatable;
  4.  
  5. class Pages extends Response {
  6.  
  7. public function __construct($get) {
  8. $this->checkAutorised('administrator');
  9. //output formatters
  10. $makeRowID = function ($d) {
  11. return $this->makeRowID($d);
  12. };
  13. $makeUrl = function ($d) {
  14. return $this->makeUrl($d);
  15. };
  16. $makeLabel = function ($d) {
  17. return $this->makeLabel($d);
  18. };
  19. $makeDate = function ($d) {
  20. return $this->makeDate($d);
  21. };
  22. //execute query
  23. $datatable = new ModelDatatable((array) $get);
  24. $datatable->setTable('pages');
  25. $datatable->addConfig('DT_RowId', 'id', $makeRowID);
  26. $datatable->addConfig('title', 'title');
  27. $datatable->addConfig('url', 'url', $makeUrl);
  28. $datatable->addConfig('publish', 'publish', $makeLabel);
  29. $datatable->addConfig('mod_date', 'mod_date', $makeDate);
  30. $this->responseValue($datatable->get(), 'json');
  31. }
  32.  
  33. private function makeRowID($value) {
  34. return 'row_' . $value;
  35. }
  36.  
  37. private function makeUrl($value) {
  38. return CONFIG_DOMAIN_URL . $value . '.html';
  39. }
  40.  
  41. private function makeLabel($value) {
  42. return $value ? '<span class="label label-success">OPUBLIKOWANA</span>' : '<span class="label label-warning">NIEOPUBLIKOWANA</span>';
  43. }
  44.  
  45. private function makeDate($value) {
  46. return date('Y-m-d H:i:s', $value);
  47. }
  48.  
  49. }
  50.  


jak widać zmienna np. $makeRowID spokojnie przekazuje metodę prywatną do obcej klasy gdzie spodziewałem się raczej błędu jednak się to prawidłowo wykonuje czyli w zasadzie chronione nie jest

php7

ps. zdaje sobie sprawę że robienie takich funkcji jak "private function makeRowID" to gruba przesada jednak formatery mogą być czasami bardziej skomplikowane niż te tutaj



com
przecież tam nie przekazujesz metody tylko jej wynik, i nie bardzo rozumiem gdzie Ty widzisz jakiś problem, chyba się trochę pogubiłeś. Nie odwołasz się do tego poza ta klasa ale w jej wnętrzu, wiec błędu nie będzie, bo niby z jakiej racji.
kayman
w klasie ModelDatatable jest dopiero wykonywana funkcja formatera
  1.  
  2. if ($config['formater']) {
  3. $function = $config['formater'];
  4. $data = $function($data);
  5. }
  6.  


a zatem i metoda prywatna obcej klasy smile.gif źle kombinuję?
Pyton_000
Zrób sobie var_dump($makeRowID); w kalasie bazowej i wywołanej. ZObacz jaki masz wynik.
kayman
nie upieram się przy prywatnej metodzie, na moje powinna być publiczna a prywatna sypać błędem, całość tego można powiedzieć jest w fazie projektu i testowania i przez pomyłkę zrobiłem metodę prywatną smile.gif

var_dump niewiele powiedział w obu przypadkach to samo
Kod
object(Closure)#6 (2) { ["this"]=> object(Framework\Ajax\Get\Pages)#5 (2) { ["params":"Framework\Ajax\Master\Response":private]=> array(0) { } ["cacheKey":"Framework\Ajax\Master\Response":private]=> NULL } ["parameter"]=> array(1) { ["$d"]=> string(10) "" } }


com
Widać nie rozumiesz chyba trochę podstaw, private oznacza, że możesz wewnątrz klasy się do metod/pól odwoływać, ale już poza nią nie, czyli:
  1. $page = new Page(..);
  2. $makeRowID = function ($d) {
  3. return $page->makeRowID($d); //Bład
  4. };
  5.  
  6. //execute query
  7. $datatable = new ModelDatatable((array) $get);
  8. $datatable->setTable('pages');
  9. $datatable->addConfig('DT_RowId', 'id', $makeRowID);

To wywołane poza klasa wyrzuci błąd, ale wewnątrz niej nie, bo niby czemu by miało skoro $this wskazuje na Framework\Ajax\Get\Pages.
kayman
przyznaję że w tej konstrukcji jak ta moja klasa nie bardzo to rozumiem, w ogóle nie podoba mi się taki sposób pisania tych formaterów, jednak jest potrzeba wstrzyknięcia takich funkcji do konfiguracji wiec tak zostanie dopóki nie wymyśle czegoś innego
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.