Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Czy można dodać funkcję do klasy poza klasą?
tuner
post
Post #1





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 10.12.2004

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


Czy możliwe jest stworzenie funkcji dla klasy poza jej obszarem?

Chciałbym stworzyć klasę:
Kod
<?
class test
{
}
?>


a potem dodac do niej funkcje, np:
Kod
function pisz()
{
print 'czesc';
}


Można?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
dr_bonzo
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Raczej nie. A zreszta sprawdz: w C++ robilo sie to tak:

Kod
class Klasa
{
// tu chyba byl prototyp funkcji
public function blabla();
}

Klasa::public function blabla()
{
//....
}


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
bela
post
Post #3


Administrator PHPedia.pl


Grupa: Developerzy
Postów: 1 102
Pomógł: 2
Dołączył: 14.09.2003

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


Można przez dziedziczenie


--------------------
Go to the top of the page
+Quote Post
dasko
post
Post #4





Grupa: Zarejestrowani
Postów: 179
Pomógł: 0
Dołączył: 9.11.2004

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


@dr_bonzo: w c++ to nie jest to jakiś specjalny sposób na dopisywanie metod do klasy. To po prostu zwyczajny sposób na zdefiniowanie metody - konieczny w przypadku, gdy chce się stworzyć metodę nie-inline smile.gif. A poza tym to powinno wygladac tak:
Kod
class Klasa {
public:
void foo();
}

void Klasa::foo() {
cout << "Elo world";
}
Go to the top of the page
+Quote Post
Ociu
post
Post #5





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




  1. <?php
  2. interface test {
  3. public function something( $var );
  4. }
  5.  
  6. class test2 implements test {
  7. public function something( $var )
  8. {
  9. # dzialanie
  10. }
  11. ?>
Go to the top of the page
+Quote Post
SongoQ
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


@Ociu nie rozumiem co przez ten przyklad chciales pokazac.


--------------------
Go to the top of the page
+Quote Post
tuner
post
Post #7





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 10.12.2004

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


Bo mam taki problem.

Mam klasę engine tworzoną za pomocą singletonu (czy jak to tam się o tym mówi). Klasa ta posiada metodę run(); która uruchamia domyślne moduły. W plikach, np. download.php, guestbook.php muszą występować inne instrukcje uruchomienia modółów (tak ma być) dlatego tworzone są klasy (np. engine_download w pliku download.php) dziedziczące z klasy engine, które posiadają inne instrukcje w metodzie run();. Tu zaczyna się problem ponieważ klasy template, input itd. wymagane do pracy silnika/modułów tworzą sobie porzez singleton referencję do obiektu klasy engine. Jednak jak już powiedziałem w niektórych plikach (np. download.php) silnik będzie stworzony nie z klasy engine, ale z engine_download. Wieć obiekt "prawdziwy" silnika będzie engine_download, a np. klasa template zrobi sobie obiekt z klasy engine - będą dwa obiekty, a ja chcę by zawsze pracował jeden.

  1. <?php
  2.         class engine {
  3.         
  4.         (...)
  5.  
  6.         public function getInstance()
  7.         {
  8.                 static $instance = NULL;
  9.                 if($instance == NULL)
  10.                 {
  11.                         $instance = new engine;
  12.  
  13.                 }
  14.                 return $instance;
  15.         }
  16. ?>

  1. <?php
  2.         class template
  3.         {
  4.                 function costam()
  5.         {
  6.                 $this->engine=engine::getInstance();
  7.           }
  8.         }
  9. ?>


Jakieś pomysły?

Ten post edytował tuner 3.04.2005, 12:47:13
Go to the top of the page
+Quote Post
cagrET
post
Post #8





Grupa: Zarejestrowani
Postów: 90
Pomógł: 0
Dołączył: 3.04.2003
Skąd: Opole

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


Da się, troszkę zakręcony sposób ale się da, szukaj w manualu funkcji overload().
  1. <?php
  2.  
  3. class Test {
  4. function __call(..) {
  5. // tutaj można wywołać funkcję pisz(), przekazać $this
  6. }
  7. }
  8. function pisz($obj) {}
  9. $Test->pisz();
  10. ?>

Więcej w manualu.


--------------------
code.gosu.pl
Go to the top of the page
+Quote Post
tuner
post
Post #9





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 10.12.2004

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


Ciekawy pomysł. Przemyślę całość rozwiązania, można znajdę jakieś inne rozwiązanie tego co chcę zrobić.

EDIT:
Może po prostu zrobię metodę run(); poza klasą - nie będę musiał się bawić w tworzenie dziedziczonej klasy, co o tym myślicie?

Ten post edytował tuner 3.04.2005, 15:41:17
Go to the top of the page
+Quote Post
Imperior
post
Post #10





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 16.10.2004

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


Cytat(tuner @ 2005-04-03 11:44:58)
Wieć obiekt "prawdziwy" silnika będzie engine_download, a np. klasa template zrobi sobie obiekt z klasy engine - będą dwa obiekty, a ja chcę by zawsze pracował jeden.

  1. <?php
  2. class Engine {
  3.     static $oInstance = null;
  4.     
  5.     public static function GetInstance() {
  6.         if (self::$oInstance == null) {
  7.             self::$oInstance = new Engine();
  8.         }
  9.         return self::$oInstance;
  10.     }
  11.     
  12.     /* TYLKO DLA CELÓW TESTU */
  13.     public static function Clear() {
  14.         self::$oInstance = null;
  15.     }
  16. }
  17.  
  18. class Engine_Download extends Engine {
  19.     
  20.     public static function GetInstance() {
  21.         if (parent::$oInstance == null) {
  22.             parent::$oInstance = new Engine_Download();
  23.         }
  24.         return parent::$oInstance;
  25.     }
  26.     
  27. }
  28.  
  29. if (get_class(Engine::GetInstance()) == 'Engine') { echo 'Imperior dobrze kombinuje'; }
  30. Engine::Clear();
  31. Engine_Download::GetInstance();
  32. if (get_class(Engine::GetInstance()) == 'Engine_Download') { echo ' i nawet to działa.'; }
  33.  
  34. ?>


EDIT:
Kombinuje jak zrobić, żeby klasa tego rzędu co Engine_Download nie musiała implementować metody GetInstance(), ale nie bardzo wiem jak to zrobić... get_class coś nie bardzo chwyta i jak dam Engine_Download::GetInstace() to mimo wszystko zwraca 'Engine'. Najważniejsze, że podany przykład działa smile.gif.

Ten post edytował Imperior 4.04.2005, 15:33:58


--------------------
Com powiedział, powiedziałem.
Go to the top of the page
+Quote Post
Ociu
post
Post #11





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




SongoQ: mój błąd, na szybko przejrzałem temat.
Go to the top of the page
+Quote Post
tuner
post
Post #12





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 10.12.2004

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


O cholera, działa! Imprerior dzięki! cool.gif
Go to the top of the page
+Quote Post
dasko
post
Post #13





Grupa: Zarejestrowani
Postów: 179
Pomógł: 0
Dołączył: 9.11.2004

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


@Imperior: Ja też tak próbowałem, nawet ze stałą __CLASS__. Ale nie wyszło, nie odziedziczyło ;/
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: 22.08.2025 - 09:09