Автор Тема: Обект в клас  (Прочетена 1624 пъти)

koleto

  • Напреднали
  • *****
  • Публикации: 52
  • Distribution: Ubuntu
  • Window Manager: Gnome
    • Профил
    • WWW
Обект в клас
« -: Sep 19, 2009, 00:04 »
Здравейте. Имам едно питане. В PHP може ли да се направи така, че методите и свойствата на даден обект да бъдат използвани във всички методи на клас, различен от родителския за обекта. Имам предвид това, че искам да напиша следното в декларацията на променливите - private $object = New Object(); но след като го напиша ми дава грешка. Искам да мога да ползвам даден обект във всички методи на класа. Мисля че е грешно във всеки един метод да декларирам обекта на ново. Или не съм прав? Първо ми дойде идея, в конструктора на класа да направя някаква магия който да декларират обекта, но не става, защото те се наследяват и конструктора не може да бъде предефиниран. След това ми дойде на ум, че мога да го направя със статична свойства на класа Object и да мога да си ги викам спокойно Object::method, примерно. Но така ми се струва, че бягам от проблема. Дано да съм го обяснил добре.
Активен

Поражение не съществува, докато човек не се признае за победен!

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: Обект в клас
« Отговор #1 -: Sep 19, 2009, 00:39 »
Нещо не те разбрах...
Код
GeSHi (PHP):
  1. <?
  2.  
  3. class A
  4. {
  5. public function f1()
  6. {
  7. echo 'A::f1';
  8. }
  9.  
  10. }
  11.  
  12. class B
  13. {
  14. protected $objA = null;
  15.  
  16. public function __construct()
  17. {
  18. $this->objA = new A();
  19. }
  20.  
  21. public function f1()
  22. {
  23. $this->objA->f1();
  24. }
  25. }
  26.  
  27. class C extends B
  28. {
  29. public function f2()
  30. {
  31. $this->objA->f1();
  32. }
  33. }
  34.  
  35. class D extends B
  36. {
  37. public function __construct()
  38. {
  39. parent::__construct();
  40.  
  41. ...
  42. }
  43.  
  44. public function f2()
  45. {
  46. $this->objA->f1();
  47. }
  48. }
  49.  
  50. $b = new B();
  51. $c = new C();
  52. $d = new D();
  53.  
  54.  
  55. $b->f1();
  56. $c->f2();
  57. $d->f2();

Какво не му е наред на това според теб?
« Последна редакция: Sep 19, 2009, 00:42 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

koleto

  • Напреднали
  • *****
  • Публикации: 52
  • Distribution: Ubuntu
  • Window Manager: Gnome
    • Профил
    • WWW
Re: Обект в клас
« Отговор #2 -: Sep 19, 2009, 01:09 »
Да си говорим в код

Код
GeSHi (PHP):
  1. <?php
  2.  
  3. //родителския клас
  4. class Controller{
  5. ....
  6.     //Родителския Controller си има конструктор, затова казвам, че е не може да се предефинира
  7.     public function __construct($id,$module=null){
  8. $this->_id=$id;
  9. $this->_module=$module;
  10. $this->attachBehaviors($this->behaviors());
  11.     }
  12. .....
  13. }
  14.  
  15. //от този клас излиза обекта, който искам да ползвам в Controller
  16. class Object{
  17. ....
  18.     public function f1{
  19.          echo 'bla';
  20.     }
  21.     public function f2{
  22.          echo 'bla2';
  23.     }
  24. ....
  25. }
  26.  
  27. //тук искам да се развива действието
  28. //Къде да напиша, че $obj = new Object();?
  29. class MyController extends Controller{
  30. ....
  31. // ако напиша private $obj = new Object(); тук ми дава грешка
  32. ....
  33.     public function bla(){
  34.     //варианта е тук да има $obj = new Object();
  35.           $obj->f1();
  36.     }
  37.     public function bla2(){
  38.     //и тук да има $obj = new Object();
  39.           $obj->f2();
  40.     }
  41. .....
  42. }
  43.  
  44. $controller = new MyController();
  45. $controller->bla();
  46. $controller->bla2();
  47.  
  48. ?>
  49.  

Трябва да повтарям декларацията на обекта във всеки метод ли?
« Последна редакция: Sep 19, 2009, 01:13 от koleto »
Активен

Поражение не съществува, докато човек не се признае за победен!

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: Обект в клас
« Отговор #3 -: Sep 19, 2009, 01:12 »
Какво ти пречи да промениш конструктора на Controller?
Или да създадеш наследяващ клас MyBaseController, чийто конструктор да вика родителския Controller конструктор и да създава нов обект Object към негово си property? След това всички MyController ще наследяват MyBaseController.
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: Обект в клас
« Отговор #4 -: Sep 19, 2009, 01:16 »
Това не го разбрах:
Цитат
//Родителския Controller си има конструктор, затова казвам, че е не може да се предефинира

Оябсни :)
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

koleto

  • Напреднали
  • *****
  • Публикации: 52
  • Distribution: Ubuntu
  • Window Manager: Gnome
    • Профил
    • WWW
Re: Обект в клас
« Отговор #5 -: Sep 19, 2009, 01:19 »
Имаш предвид:
Код
GeSHi (PHP):
  1. class MyController extends Controller{
  2. ....
  3. protected $obj = null;
  4. ....
  5.     public function __construct($id,$module=null){
  6.         parent::__construct($id,$module=null);
  7.         $obj = new Object();
  8.    }
  9. ....
  10. }
  11.  

Това не го разбрах:
Цитат
//Родителския Controller си има конструктор, затова казвам, че е не може да се предефинира

Оябсни :)

До сега си мислех, че като напиша на дъщерния клас __construct(); и стария конструктор се изтрива и започва да действа новия. Ето това с parent::__construct(); не го знаех.
« Последна редакция: Sep 19, 2009, 01:21 от koleto »
Активен

Поражение не съществува, докато човек не се признае за победен!

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: Обект в клас
« Отговор #6 -: Sep 19, 2009, 01:25 »
:)
Това важи не само за конструкторите, а и за всички методи, които предефинираш.
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

koleto

  • Напреднали
  • *****
  • Публикации: 52
  • Distribution: Ubuntu
  • Window Manager: Gnome
    • Профил
    • WWW
Re: Обект в клас
« Отговор #7 -: Sep 19, 2009, 01:29 »
Благодаря много за помощта  :)
Активен

Поражение не съществува, докато човек не се признае за победен!