Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czy można dodać funkcję do klasy poza klasą?
Forum PHP.pl > Forum > PHP > Object-oriented programming
tuner
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?
dr_bonzo
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()
{
//....
}
bela
Można przez dziedziczenie
dasko
@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";
}
Ociu
  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. ?>
SongoQ
@Ociu nie rozumiem co przez ten przyklad chciales pokazac.
tuner
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?
cagrET
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.
tuner
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?
Imperior
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.
Ociu
SongoQ: mój błąd, na szybko przejrzałem temat.
tuner
O cholera, działa! Imprerior dzięki! cool.gif
dasko
@Imperior: Ja też tak próbowałem, nawet ze stałą __CLASS__. Ale nie wyszło, nie odziedziczyło ;/
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.