Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czy jest możliwość zablokowania utworzenia obiektu w konstruktorze?
Forum PHP.pl > Forum > PHP
byq_pl
Witam,
czy jest możliwość aby konstruktor w jakiś sposób pozwalał lub blokował tworzenie danego obiektu? W żaden sposób nie mogę tego ugryźć a potrzebuję danej funkcjonalności.
Pozdrawiam

// edycja
Napiszę na przykładzie o co mi chodzi.
  1. $z = new K();
  2. $z == false; // K() zwraca false;
  3. // lub
  4. $z == object; //K() zwraca true;
wookieb
Tak. Np ustawisz mu metodę dostępu na prywatną (private) bądź chronioną (protected)
byq_pl
Cytat(wookieb @ 9.09.2010, 09:34:41 ) *
Tak. Np ustawisz mu metodę dostępu na prywatną (private) bądź chronioną (protected)

Niestety chodzi mi o coś innego. Tak stworzony konstruktor spowoduje błąd podczas tworzenia obiektu poza metodami klasy. Chciałbym aby błędu nie było i obiekt nie był w ogóle tworzony.
wookieb
Ale dlaczego nie chcesz żeby był tworzony? Jaki masz w tym cel?
byq_pl
Przypuśćmy, że mapuję bazę danych. I jeżeli obiekt o danym ID istnieje w innym miejscu nie chcę aby ten obiekt był tworzony. Jest mi on w ogóle nie potrzebny.
wookieb
Co tzn z innym miejscu? Podaj bardziej obrazowy przykład.
lDoran
Nie za bardzo rozumiem o co Tobie chodzi, ale może dobrym rozwiązaniem będzie zaimplemntowanie wszystkich metod jako statyczne
maurycy815
Mu chodzi o to
masz folder

-folder
| plik.txt
+ folder_dane


On chce stworzyć blokadę jak byś chciał zrobić "plik.txt" w "folder_dane" to wywali ci błąd że taki plik istnieje w innym katalogu.
byq_pl
Cytat(maurycy815 @ 9.09.2010, 10:53:24 ) *
Mu chodzi o to
masz folder

-folder
| plik.txt
+ folder_dane

On chce stworzyć blokadę jak byś chciał zrobić "plik.txt" w "folder_dane" to wywali ci błąd że taki plik istnieje w innym katalogu.


Dokładnie. Natomiast najważniejsze jest dla mnie aby:

konstruktor POZWALAŁ lub NIE* na stworzenie obiektu z którego jest wywoływany (*od razu niszczył sam siebie).

Nawet jak konstruktor zwróci false to jest to ignorowane i obiekt i tak jest tworzony.
Wywoływanie destruktora w konstruktorze też nie pomaga.
nospor
Cytat
Nawet jak konstruktor zwróci false to jest to ignorowane i obiekt i tak jest tworzony.
Bo kontruktor zwraca obiekt i nic wiecej ani mniej.

Rzuć w konstruktorze wyjątkiem i po sprawie.
Khanmael
Witam.
Jak na moje oko chodzi ci mniej wiecej o singleton. Poszukaj sobie o ty. design patterns + singleton i chyba po problemie.

Pozdrawiam.
Zyx
Doprecyzowanie ad. powyższego postu -> konstruktor nic nie zwraca, nawet tworzonego obiektu. Nie da się zablokować tworzenia obiektu na etapie wykonywania, ponieważ konstruktor jest wywoływany, gdy obiekt jako taki już istnieje. Wyjątek powstrzyma jedynie jego zwrócenie przez operator new, a wrażenie "nieutworzenia" powodowane jest przez to, że najczęściej taki obiekt od razu trafia do odśmiecacza. Jednak wciąż istnieje dla niego możliwość przeżycia i poniżej pokazuję skrypt, który to demonstruje:

  1. <?php
  2. class Foo
  3. {
  4. static public $registry;
  5.  
  6. public $lol;
  7.  
  8. public function __construct()
  9. {
  10. self::$registry = $this;
  11.  
  12. $this->lol = 5;
  13. throw new Exception('Nie ma głupich!');
  14. } // end __construct();
  15. }
  16.  
  17. try
  18. {
  19. $obj = new Foo;
  20. }
  21. catch(Exception $exception)
  22. {
  23. var_dump(is_object(Foo::$registry));
  24. echo Foo::$registry->lol;
  25. }


Natomiast istnieje możliwość kontrolowania samego zachodzenia procesu tworzenia obiektu poprzez zadeklarowanie konstruktora jako metody prywatnej lub chronionej, co zostało już wyżej wspomniane.
Crozin
Rozwiązaniem mogłoby być coś takiego (o ile dobrze zrozumiałem)

  1. <?php
  2.  
  3. class MyClazz {
  4. protected function __construct() {
  5. // blah blah blah
  6. }
  7.  
  8. public static function newInstance() {
  9. return (/* Jakiś tam warunek */) ? new self() : false;
  10. }
  11. }
  12.  
  13. // ....
  14.  
  15. $my = MyClazz::newInstance();


Jednakże wg mnie źle kombinujesz i nie powinieneś robić czegoś takiego. To czy obiekt powinien być w ogóle utworzony powinno być sprawdzane przed próbą jego utworzenia, a nie w samym obiekcie/klasie.
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.