Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> przekazywanie metody prywatnej przez funkcję, w zasadzie spodziewałem się błędu
kayman
post
Post #1





Grupa: Zarejestrowani
Postów: 556
Pomógł: 40
Dołączył: 20.07.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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



Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
com
post
Post #2





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


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.

Ten post edytował com 29.04.2017, 16:55:32
Go to the top of the page
+Quote Post
kayman
post
Post #3





Grupa: Zarejestrowani
Postów: 556
Pomógł: 40
Dołączył: 20.07.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif) źle kombinuję?

Ten post edytował kayman 29.04.2017, 17:10:49
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Zrób sobie var_dump($makeRowID); w kalasie bazowej i wywołanej. ZObacz jaki masz wynik.
Go to the top of the page
+Quote Post
kayman
post
Post #5





Grupa: Zarejestrowani
Postów: 556
Pomógł: 40
Dołączył: 20.07.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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ą (IMG:style_emoticons/default/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) "" } }


Go to the top of the page
+Quote Post
com
post
Post #6





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


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.

Ten post edytował com 29.04.2017, 19:18:41
Go to the top of the page
+Quote Post
kayman
post
Post #7





Grupa: Zarejestrowani
Postów: 556
Pomógł: 40
Dołączył: 20.07.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 19:36