Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Kontroler i klasy
Forum PHP.pl > Forum > PHP
matrik
Witam
Mam problem z dziedziczeniem klas, m. in. chodzi mi o załadowanie do klasy Controller innych klas np Input
Każda klasa miała by swoją zmienna $this->NazwaKlasy

Napisałem taki kod, który nie działa a chodzi mi mniej więcej o to co pisze w kodzie:

  1. <?
  2. class Language{
  3. function mget(){
  4. return "tekst";
  5. }
  6. }
  7.  
  8. class Controller{
  9. function view(){
  10. return $this->Language->PL('wartosc');
  11. }
  12. }
  13.  
  14. class Base{
  15.  
  16. function __construct(){
  17. $this->Language = new Language();
  18. $this->controller = new Controller();
  19. }
  20. }
  21.  
  22. class System extends Base{
  23. function view(){
  24. return $this->controller->view();
  25. }
  26. }
  27. $kl = new System();
  28. echo $kl->view();
  29. ?>


Jak wiadomo zwraca blad "Fatal error: Call to a member function PL() on a non-object in $.php on line 10"

Czy wie ktoś jak przypisać klasy do zmienncyh $this tak zeby bylo widoczne także w innych klasach?
Nie chce używać statycznego połączenia "Klasa::Funkcja();".
zend
Bo nie tworzysz instancji w kontrolerze. Poza tym w Language nie ma metody PL
  1. $container = new Container();
  2. $container -> addCLass('translator' , new Language());
  3.  
  4. $c = new Controller($container);
  5.  
  6. //dorzucasz protected $container; na początku definicji klasy kontrolera, przypisujesz tam container'a
  7.  
  8. w metodzie kontolera dajesz
  9. $this -> container -> translator -> PL();


Poczytaj jeszcze trochę teorii, bo bez tego daleko nie zajedziesz

Edit:
to jest cały kod czy tylko "ogólnik"?
matrik
Chodzi mi o wykorzystanie działania CodeIgniter tak, że w zmiennych $this->input->post('login'); są umieszczone klasy lub jakoś przeniesione metody.
Zależy mi na takim działaniu, bardzo ułatwia pisanie sporych aplikacji, a na CodeIgniter nie chcę się przerzucać.
szok
Powiedz mi gdzie masz metodę PL w klasie Language?
  1.  
  2. class Language{
  3.  
  4. function mget(){
  5.  
  6. return "tekst";
  7.  
  8. }
  9.  
  10. }


A odwołujesz się do tego:

  1.  
  2. class Controller{
  3.  
  4. function view(){
  5.  
  6. return $this->Language->PL('wartosc');
  7.  
  8. }
  9.  
  10. }


Dostajesz właśnie taki błąd, Po co wymyślać kolo na nowo i pisać własne skoro jest dobre rozwiązanie w CodeIgniterze?
zend
  1. class Container
  2. {
  3.  
  4. protected $_objects = array();
  5.  
  6. public function __set($name , $value)
  7. {
  8. $this -> _objects[$name] = $value;
  9. }
  10.  
  11. public function __get($name)
  12. {
  13. return $this -> _objects[$name];
  14. }
  15.  
  16. public function __isset($name)
  17. {
  18. return isset($this -> _objects[$name]);
  19. }
  20.  
  21. }
  22.  
  23.  
  24. class Controller
  25. {
  26. protected $_container;
  27.  
  28. public function __construct(Container $container)
  29. {
  30. $this -> _container = $container;
  31. }
  32.  
  33. public function __get($name)
  34. {
  35. return $this -> _container -> __get($name);
  36. }
  37.  
  38. public function __isset($name)
  39. {
  40. return $this -> _container -> __isset($name);
  41. }
  42.  
  43. public function view()
  44. {
  45. $this -> db -> query('SELECT');
  46. }
  47.  
  48. }
  49.  
  50. $co = new Container();
  51. $co -> db = new Database();
  52.  
  53. $c = new Controler($co);
  54. $c-> view();
matrik
zend - bardzo Ci dziękuje już wiem dlaczego mi nie mogłem tego zrozumieć smile.gif
szok - tam zamiast mget powinno być PL, sory za błąd

Wszystko już gra smile.gif, Dzięki za fatygę tongue.gif

Zauważyłem jeszcze coś czego chyba nie opisałem
Jeśli mam kod:
  1. <?
  2. class Container
  3. {
  4. protected $_objects = array();
  5.  
  6. public function __set($name , $value){
  7. $this -> _objects[$name] = $value;
  8. }
  9.  
  10. public function __get($name){
  11. return $this -> _objects[$name];
  12. }
  13.  
  14. public function __isset($name){
  15. return isset($this -> _objects[$name]);
  16. }
  17. }
  18. /////
  19. class addon{
  20. function open(){
  21. return "tekst";
  22. }
  23. }
  24.  
  25. class addon2{
  26. function open(){
  27. return $this->addon->open();
  28. }
  29. }
  30. /////
  31. class Controller
  32. {
  33. protected $con;
  34. public function __construct(Container $container){
  35. $this -> con = $container;
  36. }
  37.  
  38. public function __get($name){
  39. return $this -> con -> __get($name);
  40. }
  41.  
  42. public function __isset($name){
  43. return $this -> con -> __isset($name);
  44. }
  45. }
  46.  
  47. $co = new Container();
  48. $co -> addon = new addon();
  49. $co -> addon2 = new addon2();
  50.  
  51. $c = new Controller($co);
  52. echo $c -> addon2 -> open();
  53. ?>

Chodzi mi o to, by klasy addon mogły siebie jeszcze nawzajem widzieć, tak żeby nie dopisywać do nich żadnego kodu
zend
  1. <?php
  2.  
  3. class Container
  4. {
  5.  
  6. protected $_objects = array();
  7.  
  8. public function __set($name , $value)
  9. {
  10. if($value instanceof IContainer)
  11. $value -> setContainer($this);
  12. $this -> _objects[$name] = $value;
  13. }
  14.  
  15. public function __get($name)
  16. {
  17. return $this -> _objects[$name];
  18. }
  19.  
  20. public function __isset($name)
  21. {
  22. return isset($this -> _objects[$name]);
  23. }
  24.  
  25. }
  26.  
  27.  
  28. class Controller
  29. {
  30. protected $_container;
  31.  
  32. public function __construct(Container $container)
  33. {
  34. $this -> _container = $container;
  35. }
  36.  
  37. public function __get($name)
  38. {
  39. return $this -> _container -> __get($name);
  40. }
  41.  
  42. public function __isset($name)
  43. {
  44. return $this -> _container -> __isset($name);
  45. }
  46.  
  47. public function view()
  48. {
  49. $this -> db -> query('SELECT');
  50. }
  51.  
  52. }
  53.  
  54. interface IContainer
  55. {
  56. public function setContainer(Container $c);
  57. }
  58.  
  59. class db implements IContainer
  60. {
  61.  
  62. protected $_container;
  63.  
  64. public function setContainer(Container $c)
  65. {
  66. $this -> _container = $c;
  67. }
  68.  
  69. public function __get($name)
  70. {
  71. return $this -> _container -> __get($name);
  72. }
  73.  
  74. public function __isset($name)
  75. {
  76. return $this -> _container -> __isset($name);
  77. }
  78.  
  79. public function xxx()
  80. {
  81. $this -> _container -> query();
  82. //lub
  83. $this -> query();
  84. }
  85.  
  86. }
  87.  
  88. $co = new Container();
  89. $co -> db = new Database();
  90.  
  91. $c = new Controler($co);
  92. $c-> view();
  93.  
  94.  
  95. ?>
matrik
a mozna by bylo zrobic przyklad z klasami addon?
i jakby mozna bylo opisac krotko ktora klasa co robi ;/
bo czytalem zagraniczne tutki i wszystko sie pomieszalo a dopiero co przyswajam wiedze o OOP
jeszcze jakby mozna bylo na gg albo jabber 7670898 / webout@aqq.eu
zend
  1. class Addon implements IContainer
  2. {
  3.  
  4. protected $_container;
  5.  
  6. public function setContainer(Container $c)
  7. {
  8. $this -> _container;
  9. }
  10.  
  11. public function getAddon2()
  12. {
  13. return $this -> _container -> addon2;
  14. }
  15. }

Ustawianie jak wyżej
matrik
  1. <?php
  2. class Scan implements IContainer{
  3. protected $_container;
  4.  
  5. public function setContainer(Container $c){
  6. $this -> _container;
  7. }
  8.  
  9. function filtr($string){
  10. return htmlspecialchars($string);
  11. }
  12. }
  13.  
  14. class Input implements IContainer{
  15. protected $_container;
  16.  
  17. public function setContainer(Container $c){
  18. $this -> _container;
  19. }
  20.  
  21. function Mget($name){
  22. return $this->scan->filtr($_GET[$name]);
  23. }
  24. }
  25.  
  26.  
  27. class Container{
  28.  
  29. protected $_objects = array();
  30.  
  31. public function __set($name , $value){
  32. if($value instanceof IContainer)
  33. $value -> setContainer($this);
  34. $this -> _objects[$name] = $value;
  35. }
  36.  
  37. public function __get($name){
  38. return $this -> _objects[$name];
  39. }
  40.  
  41. public function __isset($name){
  42. return isset($this -> _objects[$name]);
  43. }
  44.  
  45. }
  46.  
  47. interface IContainer{
  48. public function setContainer(Container $c);
  49. }
  50.  
  51. class Open implements IContainer{
  52.  
  53. protected $_container;
  54.  
  55. public function setContainer(Container $c){
  56. $this -> _container = $c;
  57. }
  58.  
  59. public function __get($name){
  60. return $this -> _container -> __get($name);
  61. }
  62.  
  63. public function __isset($name){
  64. return $this -> _container -> __isset($name);
  65. }
  66.  
  67. public function URI($string){
  68. return $this -> input -> Mget($string);//action => example.pl/?action=wartosc
  69. }
  70.  
  71. }
  72.  
  73. class Controller{
  74. protected $_container;
  75.  
  76. public function __construct(Container $container){
  77. $this -> _container = $container;
  78. }
  79.  
  80. public function __get($name){
  81. return $this -> _container -> __get($name);
  82. }
  83.  
  84. public function __isset($name){
  85. return $this -> _container -> __isset($name);
  86. }
  87. }
  88. $_GET['action'] = "<script ...>";
  89. $co = new Container();
  90. $co -> input = new Input();
  91. $co -> scan = new Scan();
  92. $co -> open = new Open();
  93.  
  94. $c = new Controller($co);
  95. echo $c-> open -> URI("action");
  96. ?>


Klasa Scan nie widzi swojej koleżanki Input odwołując się w klasie Scan do klasy Input poprzez $this->input->filtr('string');
zend
Zacznij może od podstaw - zmiennych, potem powolutku przejdź przez kolejne działy php, a potem zabierz się za programowanie obiektowe, poczytaj też o __get i __set
Cytat
  1. public function setContainer(Container $c){
  2. $this -> _container; //WTF?
  3. }
  4. //i nie dziw się że ci nie działa bo brak też __get i __set
matrik
Zagiąłeś mnie trochę haha.gif
Nie pisał bym tematu dotyczącego OOP jeśli nie znałbym podstaw tongue.gif
Ja nie rozumiem tylko tego, że nie mogą się klasy kontaktować (Input, Scan), reszte chyba rozumiem.
zend
Dałem Ci gotowca, kilka przykładów, a Ty uważając że coś wiesz już dawno powinieneś dojść jak co działa, tu nie ma żadnej filozofii, kilka linijek prostego kodu, przeczytałeś chociaż o getterach i setterach? A czemu miały by się kontaktować? Przecież nie zaimpelentowałeś mechanizmu pozwalającego na kontaktowanie się. Tu nie ma żadnej magii, no dobra może troszkę winksmiley.jpg Nadmienię jeszcze że nie musisz za każdym razem przepisywać tego kodu który podałem, możesz go wpakować do klasy, a później z niej dziedziczyć

Cytat
Nie pisał bym tematu dotyczącego OOP jeśli nie znałbym podstaw tongue.gif
Oj kolego, podstaw z obiektówki to Ty napewno nie masz
matrik
Trafna uwaga tongue.gif
Do niektórych klas trochę nadpisałem kodu nie potrzebnie haha.gif
Szczerze to sam nie wiem dlaczego zapomniałem jak to się robi... niecałe 6-5 miesięcy temu korzystałem z tego. :/ Widocznie nie mam trwałej pamięci albo za krótko się uczyłem biggrin.gif
Ale dzięki za pomoc, pomogło mi to trochę smile.gif

Zend - nacisk na mnie innych osób daje mi większe obroty pracy... serio
właśnie mi wszystko działa dodałem jeszcze jedną klasę i działa bardzo ładnie smile.gif
Bardzo dziękuje smile.gif
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.