Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wywolywanie metod wrapper-ow, za pomoca __call
marcio
post
Post #1





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Witam przepisuje sobie db manager i ogolnie wrapper-y poszczegolnych baz i mam maly problem.
Mam klase Vf_Db ktora wybiera i tworzy obiekt adaptera na ktorym pozniej mozna wykonywac zapytania, problem polega na tym ze musialbym opisac wszystkie metody adapterow w glownej klasie czyli:
  1. class Vf_Db
  2. {
  3. publib function Select($arg1, $arg2)
  4. {
  5. $this -> adapter -> Select($arg1, $arg2);
  6. }
  7. }

I nie chce mi sie teraz pisac tak ponad 20 metod, i potem dodawac nowe lub modyfikowac ich sygnatury gdy cos zmienie, jednak __call nie chce dzialac...
[php]
<?php

/**
*Volta framework

*@author marcio <opi14@op.pl>, <polishvodka7@gmail.com>
*@copyright Copyright © 2012, marcio
*@version 1.0
*/


class%2

Ten post edytował marcio 19.04.2012, 10:42:26


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


1. Dlaczego nie utworzysz wspólnego interfejsu dla adapterów i nie będziesz operować bezpośrednio na nich?
2. Zobacz sobie co masz pod self::$instance[$this -> db].
3. Konstruktor nie może zwracać żadnej wartości, podstawy języka.
Go to the top of the page
+Quote Post
marcio
post
Post #3





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Dlaczego nie utworzysz wspólnego interfejsu dla adapterów i nie będziesz operować bezpośrednio na nich?
  1. class Vf_Mysql_Query_Adapter extends Vf_Database implements ITransactions { }

Kazda klasa ma takie same API

Cytat
Konstruktor nie może zwracać żadnej wartości, podstawy języka.

Haha taki moj nawyk, bezsens ogolnie ;]

Cytat
self::$instance[$this -> db]

No i wlasnie tu jest problem, gdy wywolam klase na "czysto"
Cytat
$db = new Vf_MySql_Query_Adapter();
$db -> connect();

To wszystko dziala

LOL mozna zawsze miec takie glupie problemy i nie wiedziec czemu nie dziala, ironia losu sleep.gif'

NVM
  1. public function Select($rows, $table, $callbackFunc = '', $callbackAs = true)
  2. {
  3. return $this -> adapter -> Select($rows, $table, $callbackFunc, $callbackAs);
  4. }

I wszystko nagle dziala kazda inna metoda dziala nie wiem dlaczego ale bez deklaracji choc jednej metody(jakiejkolwiek) nie chce dzialac.

Ten post edytował marcio 19.04.2012, 11:35:20


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


No to pokaż ten niedziałający kod (byleby to nie było pięć stron tekstu).
Go to the top of the page
+Quote Post
marcio
post
Post #5





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


  1. <?php
  2.  
  3. /**
  4. *Volta framework
  5.  
  6. *@author marcio <opi14@op.pl>, <polishvodka7@gmail.com>
  7. *@copyright Copyright (c) 2012, marcio
  8. *@version 1.0
  9. */
  10.  
  11.  
  12. class Vf_Dbs
  13. {
  14. protected static $instance;
  15.  
  16. protected $db;
  17.  
  18. protected $adapter;
  19.  
  20.  
  21. public static function Factory($db)
  22. {
  23. if(!isset(self::$instance[$db]))
  24. {
  25. self::$instance[$db] = new self();
  26. }
  27. return self::$instance[$db];
  28. }
  29.  
  30.  
  31. public function __construct()
  32. {
  33. $cfg = new Vf_Config(DIR_CONFIG);
  34. if(file_exists(DIR_DRIVERS.'Db/'.$cfg -> DbType.'.php'))
  35. {
  36. $this -> db = $cfg -> DbType;
  37. require_once(DIR_DRIVERS.'Db/'.$cfg -> DbType.'.php');
  38. $className = 'Vf_'.$cfg -> DbType.'_Query_Adapter';
  39.  
  40. if(class_exists($className))
  41. {
  42. $this -> adapter = new $className();
  43.  
  44. if($this -> adapter instanceof Vf_Database)
  45. {
  46. $this -> adapter -> connect();
  47. }
  48. }
  49. }
  50. }
  51.  
  52.  
  53. public static function &getInstance($db)
  54. {
  55. if(!isset(self::$instance[$db]))
  56. {
  57. self::$instance[$db] = new self();
  58. }
  59. return self::$instance[$db];
  60. }
  61.  
  62.  
  63. public function Select($rows, $table, $callbackFunc = '', $callbackAs = true)
  64. {
  65. return $this -> adapter -> Select($rows, $table, $callbackFunc, $callbackAs);
  66. }
  67.  
  68.  
  69. public function __call($method, $args)
  70. {
  71. if (!method_exists(self::$instance[$this -> db], $method))
  72. {
  73. throw new Exception("Brak metody {$method} w adapterze {$this -> db}");
  74. }
  75. return call_user_func_array(array(self::$instance[$this -> db], $method), $args);
  76. }
  77. }
  78.  
  79. ?>

Bez metody Select nie dziala a z tak...


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
Crozin
post
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


1. http://sscce.org/
2. Po czym ponownie wrzuć (tym razem już odpowiednio) kod.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.08.2025 - 19:44