Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Czy jest możliwość zablokowania utworzenia obiektu w konstruktorze?
byq_pl
post 9.09.2010, 09:27:33
Post #1





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 19.02.2004
Skąd: z piekla

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


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;


Ten post edytował byq_pl 9.09.2010, 10:01:35


--------------------
"Wyobraźnia jest ważniejsza od wiedzy." - Albert Einstein
Go to the top of the page
+Quote Post
wookieb
post 9.09.2010, 09:34:41
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Tak. Np ustawisz mu metodę dostępu na prywatną (private) bądź chronioną (protected)


--------------------
Go to the top of the page
+Quote Post
byq_pl
post 9.09.2010, 09:55:07
Post #3





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 19.02.2004
Skąd: z piekla

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


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.


--------------------
"Wyobraźnia jest ważniejsza od wiedzy." - Albert Einstein
Go to the top of the page
+Quote Post
wookieb
post 9.09.2010, 09:56:08
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Ale dlaczego nie chcesz żeby był tworzony? Jaki masz w tym cel?


--------------------
Go to the top of the page
+Quote Post
byq_pl
post 9.09.2010, 10:11:30
Post #5





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 19.02.2004
Skąd: z piekla

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


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.


--------------------
"Wyobraźnia jest ważniejsza od wiedzy." - Albert Einstein
Go to the top of the page
+Quote Post
wookieb
post 9.09.2010, 10:14:28
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Co tzn z innym miejscu? Podaj bardziej obrazowy przykład.


--------------------
Go to the top of the page
+Quote Post
lDoran
post 9.09.2010, 10:29:28
Post #7





Grupa: Zarejestrowani
Postów: 172
Pomógł: 13
Dołączył: 15.11.2009

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


Nie za bardzo rozumiem o co Tobie chodzi, ale może dobrym rozwiązaniem będzie zaimplemntowanie wszystkich metod jako statyczne
Go to the top of the page
+Quote Post
maurycy815
post 9.09.2010, 10:53:24
Post #8





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 29.08.2010

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


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.
Go to the top of the page
+Quote Post
byq_pl
post 9.09.2010, 11:34:48
Post #9





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 19.02.2004
Skąd: z piekla

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


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.


--------------------
"Wyobraźnia jest ważniejsza od wiedzy." - Albert Einstein
Go to the top of the page
+Quote Post
nospor
post 9.09.2010, 11:36:28
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Khanmael
post 11.09.2010, 19:11:06
Post #11





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 10.09.2010

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


Witam.
Jak na moje oko chodzi ci mniej wiecej o singleton. Poszukaj sobie o ty. design patterns + singleton i chyba po problemie.

Pozdrawiam.
Go to the top of the page
+Quote Post
Zyx
post 11.09.2010, 19:26:35
Post #12





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


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.

Ten post edytował Zyx 11.09.2010, 19:27:28


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
Crozin
post 11.09.2010, 19:56:29
Post #13





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
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 Wersja Lo-Fi Aktualny czas: 14.08.2025 - 11:35