Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dostęp do metody z innej klasy
Forum PHP.pl > Forum > PHP > Object-oriented programming
acztery
witam,

mam mały klopot nie

mamy naprzykład dwie różne klasy które korzystaja z konstruktora.

W klasie A nie korzystam z metod z innych klas

ale w klasie B korzystam z medoty z kasy A. Jak nie mialem konstruktora odwoływałem sie tak KlasaA::medotaKlasyA().

Teraz nie moge tak zrobic bo konstruktor nie zostanie wywołany. jak to się robi tak aby było dobrze napisane

ja mam 1 pomysl

  1. <?php
  2. $klasaA = new A();
  3. $KlasaA->metoda();
  4. ?>


ale nie wiem czy tak mozna i czy to jest zgodne z Obiekotwym PHP5, moze jakies pomysły
envp
Strasznie 'pokiereszone', nie wiem czy sltszaleś o extedns (dziedziczeniu) oraz o funkcjach static snitch.gif
acztery
envp hmmm ... czytaj co pisze....... wiem co to extedns i static.

ale jezeli funkcja do której bede chcial sie odwołac po przez klasa::metoda(); nie uruchomi konstruktora.... wiec ponawiam pytanie.

np :

mam taka klase:

  1. <?php
  2. class Account {
  3.  
  4. protected $DataObject;
  5.  
  6. public function __construct()
  7. {
  8. $this->DataObject = DB_DataObject::factory('parm');
  9. }
  10.  
  11. final function upt ($_POST)
  12. {
  13.  
  14. foreach ( $_POST as $key => $value )
  15.  {
  16. $this->DataObject->query("set names 'utf8'");
  17. $this->DataObject->get($key);
  18. $this->DataObject->var = $value; $this->DataObject-> klasa::metoda(); // to sie nie wykonuje
  19. $this->DataObject->update(); 
  20.  }
  21. return;
  22. }
  23.  
  24. }
  25. ?>
LBO
Cytat(acztery @ 23.12.2006, 21:24:27 ) *
  1. <?php
  2. $this->DataObject-> klasa::metoda(); // to się nie wykonuje
  3. ?>

Zwyczajny przykład wywołania metody statycznej. Nie wiem co Tobie może nie działać (o ile nie kłamiesz, wiesz czym są takie metody i jak je tworzyć).
Napisz coś więcej o tej klasie którą chcesz użyć, logice jej działania etc.
acztery
LBO po co miał bym kłamać.

ok mam taki kod

  1. <?
  2. // plik Doc.php
  3. include_once 'Lang.class.php';
  4. class Doc extends Doc {
  5.  
  6. protected $DataObject;
  7.  
  8. public function __construct()
  9. {
  10. $this->DataObject = DB_DataObject::factory('documents');
  11.  
  12. }
  13.  
  14.  
  15. final function countDoc($_where='' , $_lang)
  16. {
  17. // Count category
  18.  
  19. if ($_where <> '') {
  20. $this->DataObject->whereAdd("Parent = '$_where'");
  21. }
  22. if ($_lang <> '') {
  23. $this->DataObject->whereAdd("Lang = '$_lang'");
  24. }else{
  25. $this->DataObject->Lang = Lang::getDisLang(); // tu cos nie działa
  26. }
  27. return $this->DataObject->count();
  28. }
  29. }
  30.  
  31. ?>
  32.  
  33. klasa Lang plik Lang.php
  34.  
  35. <?
  36. include_once 'Doc.class.php';
  37. class Lang extends Doc {
  38.  
  39. protected $DataObject;
  40.  
  41. public function __construct()
  42. {
  43. $this->DataObject = DB_DataObject::factory('lang');
  44.  
  45. }
  46.  
  47. final static function getDisLang()
  48. {
  49.  
  50. $this->DataObject->query("set names 'utf8'");
  51. $this->DataObject->display='Y';
  52. $this->DataObject->selectAdd('Prefix as value');
  53. $this->DataObject->find();
  54. while ($this->DataObject->fetch())
  55. {
  56.  $lang_->value;
  57. }
  58. return $lang_->value;
  59. }
  60. }
  61.  
  62. ?>



Czy dobrze to napisane bo nie działa, mam puste tło. a jak zamienie w pliki Lang.php na:
  1. <?php
  2. public function getDisLang()
  3. {
  4. $lang_ = DB_DataObject::factory('lang');
  5. $lang_->query("set names 'utf8'");
  6. $lang_->display='Y';
  7. $lang_->selectAdd('Prefix as value');
  8. $lang_->find();
  9. while ($lang_->fetch())
  10. {
  11.  $lang_->value;
  12. }
  13. return $lang_->value;
  14. }
  15. ?>


wywale konstruktor to działa. Moze z obiektowo pisze od paru dni wiec moge robic bledy czy widzicie cos zle?
LBO
Czyli jednak nie orientujesz się za dobrze w tym. Nie wywala Tobie żadnych błędów? Bo powinno.
W metodzie statyczne odwołujesz się do $this zmiennej która przechowuję instancję klasy. A skoro nie stworzyłeś obiektu, instancji nie ma. W metodach statycznych odpowiednikiem tego będzie self. Radzę jeszcze raz zajrzeć do manuala i poczytać User Notes. Oczywiście samo zamienienie $this na self nie załatwi sprawy, pokombinuj (podpowiedź: mój post w innym temacie który założyłeś całkiem niedawno)

I jeszcze jedno:

  1. <?php
  2. class Doc extends Doc {
  3. // some code
  4. }
  5. ?>

questionmark.gifquestionmark.gif?

edit:
Przepraszam Ciebie za to zarzucenie kłamstwa. Chodziło mi raczej, że piszesz, iż wiesz czym są statyczne metody, a wcale tak nie jest (chociaż mogłeś być o tym przekonany).
acztery
spoko jak pisałem od paru dni pisze w php5 i mam pytanie zagladłem do postu wczesniejszego co pisałes i wysylam cos do klasy jest ok ja to umiescilem w konstruktorze. działa b dobrze.

moge dac cos takiego do konstruktora

  1. <?php
  2. private $DataObjectDoc;
  3.  
  4. public function __construct()
  5. {
  6. $this->DataObjectDoc = new Doc();
  7.  
  8. }
  9. ?>


a potem jak chce sie odwolac do jakiejs metoty do

  1. <?php
  2. $this->DataObjectDoc->jakasMetoda();
  3. ?>


dodam tylko te klasy sa powiazane z DB_DataObject.
LBO
Chyba nadal Ci umyka sens tego co napisałem. Jeżeli stworzysz instancję klasy Lang - a nie będziesz się odwoływał do statycznej metody - to nie ma problemu (Lang::DataObjectDoc jest poprawnie inicjalizowana).
acztery
hm no nie wiem moze musze iwcej poczytac ale modota do której chce sie odwolac jest statyczna

i dalej nic przykladowa bo mi juz sie niechce pisac mam tak.
  1. <?php
  2. class klasaA extends klasaB 
  3. {
  4.  
  5.  
  6. ....
  7. // tu wywolanie statycznej metody z klasyB
  8.  
  9. klasaB::metoda();
  10.  
  11.  
  12. ....
  13.  
  14.  
  15. }
  16. ?>

co ja robie dalej zle moze dasz mi namiar na ciekawe art. LBO ?
koala
  1. <?php
  2. class Doc extends Doc
  3. ?>

Klasa nie może rozszerzać sama siebie

  1. <?php
  2. class Lang extends Doc
  3. ?>


Klasa Lang rozszerza klasę Doc czyli konstruktor klasy Lang nadpisuje konstruktor klasy Doc czyli to co chcesz zrobić w konstruktorze klasy Doc się nie wykona.
LBO
Cytat(koala @ 24.12.2006, 01:29:09 ) *
  1. <?php
  2. class Doc extends Doc
  3. ?>

Klasa nie może rozszerzać sama siebie


O to pytałem się już wcześniej smile.gif

Cytat(koala @ 24.12.2006, 01:29:09 ) *
  1. <?php
  2. class Lang extends Doc
  3. ?>


Klasa Lang rozszerza klasę Doc czyli konstruktor klasy Lang nadpisuje konstruktor klasy Doc czyli to co chcesz zrobić w konstruktorze klasy Doc się nie wykona.


Ale przecież Model, który on używa w klasie Lang musi być inny, niż w klasie Doc. Nie widzę w tym nic błędnego.

Cytat(acztery @ 24.12.2006, 01:09:03 ) *
  1. <?php
  2. class klasaA extends klasaB 
  3. {
  4. ....
  5. // tu wywolanie statycznej metody z klasyB
  6. klasaB::metoda();
  7. ....
  8. }
  9. ?>

co ja robie dalej zle moze dasz mi namiar na ciekawe art. LBO ?

możesz też
  1. <?php
  2. self::metoda(); // KlasaA odziedziczyła klasaB::metoda()
  3. ?>

Natomiast jeżeli nadpisałeś klasaB::metoda(), tworząć klasaA::metoda() - wtedy wewnątrz klasy odwołujesz się w ten sposób:
  1. <?php
  2. parent::metoda();
  3. ?>
acztery
ok calkiej inna klasa ale problem podobny.


klasa test 1 jest ok zwraca 100 ale klasa test2 juz nie ...

  1. <?
  2.  
  3.  
  4. class test1
  5. {
  6. static public $zmienna1;
  7.  
  8. public function __construct()
  9. {
  10. $this->zmienna1 = "10";
  11. }
  12.  
  13.  
  14. public function licz($a)
  15. {
  16. return $this->zmienna1*$a;
  17. }
  18. }
  19.  
  20.  
  21.  
  22. class test2 extends test1
  23. {
  24. static public $zmienna2;
  25.  
  26. public function __construct()
  27. {
  28. $this->zmienna2 = "9";
  29. }
  30.  
  31.  
  32. public function licz()
  33. {
  34. return test1::licz(10)+$this->zmienna2; // 109
  35. }
  36. }
  37. $a = new test1();
  38. echo "Wynik z klasy test1 : ".$a->licz(10)."<br><Br>"; // powinno zwracac 100 i jest ok
  39. $b = new test2();
  40. echo "Wynik z klasy test2 : ".$b->licz()."<br><Br>"; // powinno zwracac 109 zwraca 9 nie widzi parent:kicz(10)
  41.  
  42.  
  43. ?>


LBO widziesz cos zle bo mnie cos trafi...
LBO
Sorry, ale co to jest??

  1. <?php
  2. self::$this->zmienna1*$a;
  3. ?>


biggrin.gif

edit:

Jeżeli właściwości funkcji muszą mieć początkowe stałe wartości, nie musisz Ich inicjalizować w konstruktorze.
Nadal źle odwołujesz się do właściwości statycznych wewnątrz klasy... w sumie zapominasz też o dziedziczeniu (test2 będzie miała te same właściwości i metody co test_1, chyba, że zostaną nadpisane).
A to rozwiązanie Twojego problemu pisane z palca:

  1. <?php
  2. class ClassA
  3. {
  4. public static $variable1 = 10;
  5.  
  6. public function operation($a)
  7. {
  8. return self::$variable1 * $a;
  9. }
  10. }
  11.  
  12.  
  13.  
  14. class ClassB extends ClassA
  15. {
  16. public static $variable2 = 9;
  17.  
  18. public function operation()
  19. {
  20. return ClassA::operation(10) + self::$variable2; // 109
  21. }
  22. }
  23. $a = new ClassA();
  24. print $a->operation(10); // 100
  25. $b = new ClassB();
  26. echo $b->operation(); // 109
  27. ?>
acztery
tego tam nie ma zle wklejilem probowalem wszystkiego i zla wersje wklejilem
LBO
Edytowałem post wyżej, ale i tak sie spóźniłem. Kolejne poprawki:
Dlaczego do właściwości klasy test1::zmienna1 odwołujesz się jak do właściwości obiektu?
  1. <?php
  2. $this->zmienna1
  3. ?>

Powinno być
  1. <?php
  2. self::zmienna1;
  3. ?>
acztery
zeby nie tworzyc nowego tematu napisze tutaj udalo sie wszystko ale tak jakby nie do konca.

mam taki kod ( czesc kodh )

  1. <?php
  2. include('globals.php');
  3. $DocClasss = &new Doc();
  4. $LangClass = &new Lang();
  5. $smarty->assign('RESULTLANG',$LangClass->listLangAktiv()); // tutaj pobiera 
  6. if (empty($_GET['lang']))
  7. {
  8. $ld = $LangClass->getDisLang(); // to nie działa
  9.  
  10. }else{
  11. $ld = $_GET['lang'];
  12. }
  13. ?>


jak wywale $smarty->assign('RESULTLANG',$LangClass->listLangAktiv()); to $LangClass->getDisLang(); działa i tak analogiczne...

w klasie Lang i doc wszystkie metody oprucz konstruktora sa final public , konstrukotr public

budowa konstrukota w klasie lang

  1. <?php
  2. public function __construct()
  3. {
  4. $this->DataObjectDoc = DB_DataObject::factory('documents');
  5. $this->DataObjectLang2 = new Lang();
  6.  
  7. }
  8. ?>


dodam ze to konstruktor dobrze działa bo klasa widzi wszystko jak nalezy.

moze jakies porady.
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.