Skocz do zawartości

[php] odwołanie do klasy z klasy


gnysek

Rekomendowane odpowiedzi

  • Administratorzy

Dobra załóżmy że mam taką klasę (teoretycznie, na prawdę jest dużo bardziej rozbudowana i trochę pozmyślałem):

 

class silnik
{
function error($jaki_blad)
{
echo $jaki_blad;
die();
}
}

$silnik=new silnik

 

i drugą klasę:

 

class test
{
public $time= 0;

function ten_czas($czas)
{
global $silnik;
if ($time<>$czas)
{
$time->error('błąd');
}
else
{
return true;
}
}

}

 

jeżeli funkcji będzie więcej, ciąglę będę musiał pamiętać, aby dodać global $silnik. Czy można jakoś inaczej udostępnić klasie inną klasę (nie używając słowa new, bo chciałbym, aby była dostępna też dla innych) ? Czy muszę tę klasę silnik napisać tak, żeby każda kolejna klasa mogła jej używać jako $this->costam = new $silnik (co jest głupie bo po co sto razy definiować coś, co nie potrzebuje tego ?) ??

Odnośnik do komentarza
Udostępnij na innych stronach

Zrób z klasy singleton lub poprostu

class Silnik { 
private static $cos;

public static function funkcja($value) {
self::$cos=$value;
} 

}

Potem:

Silnik::funckja('haha');

 

A tak wogóle to jakie PHP ty chcesz to uzywać?

 

#edit

Widać że obiektowośc u ciebie kuleje.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Za mało danych żeby cokolwiek powiedzieć. Singleton odpada, bo nie po to się go stosuje. Można użyć klasę statyczną, jak zasugerował kofel, ale to też jest uzależnione od tego czy chcesz tworzyć obiekt silnika czy nie. Zostają dwa wyjścia - albo dziedziczenie, jeżeli test jest w jakimś sensie pochodną silnika, albo przekazywani obiektu przez konstruktor i w konstruktorze przypisanie jej do prywatnego pola (zmiennej), do której potem się już będziesz odwoływał za pomocą this.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

dobra, zrobiłem coś takiego

 

class B
{
    public $a = null;

    function B()
    {
        global $a;
        $this->a = & $a;
    }
}

 

po prostu klasy A potrzebuję w kilku innych klasach, bo tam są różne ważne funkcje, a dawanie ciągle global jest niepraktyczne i łatwo cos przegapić.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności
Jakto singleton odpada? ;o A mi się wydaje że dobry jest w tej sytuacji kolego.
Bo? Jak się zarzuca jakimś pomysłem, to warto potroszę wytłumaczyć. Wiesz w ogóle w jakich sytuacjach stosuje się singleton? (nie pytam się czym jest). Znać wzorce projektowe != umieć je dobrze wykorzystać.

 

@Gnysek: Kurde, klasy czy obiektu? To jest zasadnicza różnica. Jeśli klasy, to statyczna, jeśli obiekt, to czy będzie się powtarzać? Jeśli nie, to też statyczna.

Odnośnik do komentarza
Udostępnij na innych stronach

A to może singleton jest w tej sytuacji zły? ;o

<?php
class Any
{
    private static $instance;
    public $errnum;
    
    public static function getInstance()
    {
        return ($i = &self::$instance) ? $i : $i = new self;
    }
    
    public function error($text)
    {
        $this->errnum ++;
        echo '<div style="text-size: 16px; border: 1px solid red; padding: 5px; margin: 5px;">'.$text.'</div>';
        return true;
    }
}

class OtherClass
{
    function __construct()
    {
        Any::getInstance()->error('OtherClass created.');
    }
    
    public function err($text)
    {
        Any::getInstance()->error('Error: '.$text);
    }
}

$wtf = new OtherClass;
$wtf->err('LOL');
$wtf->err(Any::getInstance()->errnum);
?>

 

Zobacz to Gnysek.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Nie nie, ja chcę errora z różnych klas wywalać, np. B, C, D. Konkretnie z funkcji tych klas, ale sama funkcja wywalająca błędy i robiąca mi logi jest w klasie A.

Czyli załóżmy, że klasa A to taki główny silnik strony, a klasy B, C, D to kolejne klasy potrzebne do modułów, np. obsługa bazy danych, sesje itd, ale wszędzie błędy są wywalane w ten sam sposób, więc chciałbym korzystać z funkcji error() klasy A którą zawsze tworzę jako pierwszą, bo jest mi na stronie do wielu innych rzeczy potrzebna. A skoro już istnieje to po co duplikować ją w pozostałych klasach, czy też używać global $klasa ?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

@Kofel:

No i pokazałeś jak wygląda przykładowa implementacja singletonu, ale nie wyjaśniłeś dlaczego tutaj ma zastosowanie... a takowego w tym przypadku właśnie nie ma. Gnysek nie napisał czy musi mieć obiekt silnika czy też klasę, a jeśli obiekt to czy koniecznie jeden. Singleton tylko i wyłącznie stosujemy gdy obiekt danej klasy może być tylko jeden, unikatowy. Jeżeli ten warunek jest niespełniony / niejasny, to automatycznie nie stosujesz danego wzorca projektowego, bo to jest sprzeczne z ich ideą.

 

@Gnysek:

Rozwiązań jest parę:

1) Korzystać z wyjątków, try catch oraz pobudować własne klasy wyjątków

2) Silnik powinien być w całości klasą statyczną. Wtedy dostęp do jej publicznych metod masz z każdego miejsca skryptu, bez stosowania global.

3) Utworzyć klasę abstrakcyjną (czyli taką, której obiektu nie można stworzyć) do obsługi błędów, a następnie dziedziczyć ją w klasach "modułach".

 

Wybór należy do Ciebie. Weź na tapetę rozwiązanie numer 2, najłatwiejsze do napisania. :)

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
gnysek nie napisał czy musi mieć obiekt silnika czy też klasę, a jeśli obiekt to czy koniecznie jeden.

 

Tworzę np. $silnik = new silnik i nie chcę już więcej go tworzyć, potem tworzę np. drugą klasę ($klasa=new klasa) i chciałbym mieć w niej dostęp do funkcji z klasy $silnik, nie tworząc jej kolejny raz. Wydaje mi się, że drugie rowziązanie właśnie rozwiązuje ten problem, ale sprawdzę dopiero w domu.

Bo sprawdzałem na GMC, ale tam do $core odwołujesz się poprzez global $core, ale trzeba zauważyć, że strona była pisana 100 lat temu :P

 

 

Tak to jest jak się pisze pół w PHP4 a pół w PHP5... chyba sie przejde do empiku zaraz po jakąś dobrą ksiażkę z klasami w PHP5 :)

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Aktualny silnik GMCLANu przecież był napisany jeszcze przed wydaniem PHP5, w związku z czym nie miałem ani abstrakcji, ani statyczności, ani własnych wyjątków, ani możliwości stworzenia singletona, na którego nie wiem czemu uparł się Kofel.

 

Nowy silnik planuję oprzeć na ww. technikach + interfejsy i silnym naciskiem na refleksje (wpływ C#, chęć zasymulowania atrybutów). Nie wiem tylko czy zaszaleć i już w php 5.3 kodzić z wykorzystaniem przestrzeni nazw. A po co to wszystko? Żeby silnik był najbardziej modułowy jak tylko się da.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Nie gadamy, bo po co tworzyć obiekt i singleton, skoro można statyczną? Łatwiej, lepiej, bezpieczniej. W tym momencie tworzenie obiektu i singletona jest nieuzasadnione. Zresztą singleton służy do czego innego.

Odnośnik do komentarza
Udostępnij na innych stronach

Ej, Singleton to idea a nie od arzu konkretna implementacja ;]

A myślisz że po co są statyczne klasy? Przecież to ewidentnie dodatkowy mechanizm implementujący singleton ;]

 

Ja rozumiem, że dla Ciebie jak jest singleton to musi być obiekt, ale wzorce sie modyfikuje - proste.

Poza tym przecież jak sie odwołujesz statycznie do klasy, to istnieje niejawny "obiekt".

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

@BeWuo: No ok, ale singleton polega właśnie na implentacji unikalności w przypadku obiektów a nie klas (bo w klasach jest statyczność), więc nie wiem o co się kłócisz? Napisałem, że tutaj singleton jest zbędny, bo i tworzenie obiektu jest zbyteczne. Wszystko można rozwiązać klasą statyczną. A singleton różni się od statyczności paroma rzeczami, np. konstruktor (w niektórych językach przy statycznej klasie albo nie jest wywoływany w ogóle albo nie wiadomo kiedy). Poza tym co z interfejsami i rzutowaniem obiektu na dany interfejs? Co z dziedziczeniem klas abstrakcyjnych? I właśnie tutaj dochodzimy do tego momentu, w którym musimy sobie zadać pytanie jak chcemy daną klasę wykorzystywać. Czy jako klasę statyczną czy obiekt, bo operowanie obiektem jest zdeczka inne niż klasą i różni się możliwościami. Przecież nie odpowiem jasno na pytanie co jest w danym momencie lepsze, bo nie znam wszystkich kryteriów danej sytuacji.

 

@Kofel:

Moim zdaniem singleton służy do NIEJAWNEGO zwracania tego samego (unikatowego) obiektu, np. innym zainteresowanym obiektom. Dla nich nie będzie ważne czy to ten sam obiekt czy nie, ważne że otrzymują obiekt tego samego typu jakiego chcą i tyle. Przy czym stosowanie singletona = operowanie na obiekcie = mamy jakieś określone przesłanki by operować na obiekcie a nie statycznej klasie. Przesłanki mogą być takie jak powyżej... np. w C# jeżeli mam cały uniwersalny system zarządzania modułami w postaci obiektów, to będę mógł dodać do niego nowy moduł oparty na obiekcie (zwracanym przez singleton), co z kolei nie uda mi się w przypadku klasy statycznej.

 

Ej, Singleton to idea a nie od arzu konkretna implementacja ;]

A myślisz że po co są statyczne klasy? Przecież to ewidentnie dodatkowy mechanizm implementujący singleton ;]

No hmm... Ale czy ja pisałem o konkretnej implementacji? NIE, ja pisałem tylko o przesłankach użycia w konkretnym problemie. Tak, statyczność to swego rodzaju singleton, ale nie do końca... patrz powyżej co napisałem.

 

Ja rozumiem, że dla Ciebie jak jest singleton to musi być obiekt, ale wzorce sie modyfikuje - proste.
No ok, ale czy znasz implementację singletonu nie na obiektach? Przecież stworzyć tego na klasach statycznych się nie da.

 

@Bewuo:

Poza tym zachowujesz się jak Kofel. Na siłę można by zrobić singletona w gnyskowym przypadku, tylko po co? Jest to nieergonomiczne, zbędnie i w ogóle. Lepiej klasę statyczną lub abstrakcyjną dziedziczoną. Po co utrudniać sobie życie?

 

Po to właśnei wymyślono wzorce projektowe, by je stosować do konkretnych sytuacji, a gnyskowa takową nie jest.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie wiem o co Ci chodzi. Czy ja napisałem, że tu trzeba zaimplementować obiekt wg. wzorca singletonu? Nie czytasz uważnie.

 

Ja tylko chciałem pokazać, że statyczność w pewnym sensie jest przykładem singletonu. Bo o co chodzi w singletonie? Żeby był unikatowy obiekt jednej klasy. A statyczność prowadzi do tego ;]

 

Także jeszcze raz powiem, że chciałem wyjaśnić idee, a nie wchodzić w implementacje.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

No zgadzam się. Dlatego też implementacja singletona wymaga DODATKOWYCH przesłanek uzycia, a w gnyska problemie takowych nie ma, wiec automatycznie stosujemy klase statyczna, bo tworzenie singletona i obiektu jest calkowicie zbyteczne i nieergonomiczne. Tak wiec nie wiem po co sie czepiasz, BeWuO. Zawsze w przypadku takiego dylematu stosuje sie najlatwiejsze rozwiazanie, a nie komplikuje sobie zycie. Poza tym jak juz wczesniej napisalem, statycznosc to nie tylko unikatowosc, bo prowadzi do calkiem innego zastosowania.

Odnośnik do komentarza
Udostępnij na innych stronach

gnysek, ja pierdole kto jest twoim autorytetem, Podałem najlepsze rozwiązanie w pierwszym poście, więc poco wałkować temat? Moja odpowiedź też była prawidłowa tak samo jak Ranmusa i BeWuO.

 

Co do tematu to przyznaje głupi pomysł z singletonem, żaden ze mnie doświatczony programista (dopiero pierwszy rok programowania) , sorry za moje posty.

Odnośnik do komentarza
Udostępnij na innych stronach

Ranmus: Ja sie czepiam? ;] Co Ty dajesz... :P Ja chce Ci kolejny raz wytłumaczyć, że nie chodzi mi o ten konkretny przykład tylko o pokazanie że statyczność jest w pewnym sensie analogią do singletonu.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...