Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Co zwraca konstruktor w razie błędu?
czarek1986
post 23.11.2009, 00:52:29
Post #1





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 15.09.2008

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


Witam mam do was takie banalne pytanie, na którym niedawno sie zaciełęm. Tworzę sobie nowy obiekt jakiejś klasy. Ma ona w konstruktorze parametr id, na podstawie którego pobierane są dane z bazy które wypełniają reszte pól w obiekcie. Do tej pory myślałem, że aby przerwać tworzenie obiektu w wypadku gdy wpisu o podanym id nie ma w bazie za pomocą return false. Okazał się jednak, że tak nie jest w moim przypadku, gdyż obiekt tworzy się mimo to tylko z pustymi polami. Ogólnie jego kod wygląda tak

Kod
class Menu extends ObjectModel {
    
    protected $id_menu;
    protected $nazwa_menu;
    
    
    public function __construct($id=null) {
        parent::__construct();
        if(!empty($id))
        {
            if(!is_numeric($id))
                return false;
            $sql = "SELECT * FROM menu WHERE id_menu = '$id'";
            $menu = $this->dbhandle->select($sql);
            
            if(!empty($menu))
                $this->setAll($menu[0]);
            else
                return false;
        
          
        }
    }

}





To jest tylko kod contruktora ale powinno wystarczyć. Co mam zrobić aby w przypadku podania nieprawidłowego id obiekt nie został utworzony?

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
marcio
post 23.11.2009, 01:04:31
Post #2





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Wydaje mi sie ze nie mozna uzyskac to czego ty chcesz poniewaz obiekt musi sie stworzyc by kod kontruktora sie wykonal.

By uzwglednic czy dany obiekt ma sie utworzyc lub nie musialbys to sprawdzic przed jego inicjalizacja.



--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
Crozin
post 23.11.2009, 01:30:42
Post #3





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

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


Wyrzuć wyjątek.
Go to the top of the page
+Quote Post
kefirek
post 25.11.2009, 10:43:56
Post #4





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

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


Może to pomoże
http://php.net/manual/pl/exception.getmessage.php
Powód edycji: [batman]: Pomorze to region Polski :)
Go to the top of the page
+Quote Post
pp-layouts
post 1.12.2009, 00:58:08
Post #5





Grupa: Zarejestrowani
Postów: 53
Pomógł: 1
Dołączył: 28.09.2007
Skąd: Gdynia

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


Konstruktor nie zwraca nic. Jakakolwiek instrukcja return w konstruktorze jest ignorowana (a w każdym razie nic nie robi). Tak dzieje się zawsze. Kiedy obiekt jest tworzony dyrektywą new, konstruktor jest wykonywany, a do zmiennej przypisywana jest instancja obiektu (TO NIE JEST WARTOŚĆ ZWRACANA PRZEZ KONSTRUKTOR!).

Zamiast od razu kombinować z wyjątkami jest IMHO o wiele prostszy sposób sprawdzenia, czy konstruktor "dał radę":

  1. class krowa {
  2.   public $gotowa = false;
  3.   public function __construct($trawa = false) {
  4.     if ($trawa) $this->gotowa = true;
  5.   }
  6.   public function mu() {
  7.     return $this->gotowa ? 'MUUUUUUU!' : 'A trawsko gdzie?!';
  8.   }
  9. }



Masz klasę krowa. Odpalasz konstruktor, w którym możesz podać trawę, lub nie. Jeśli nie podasz, to będzie nasz błąd. Przy właściwym utworzeniu, nasza krowa prawidłowo obsługuje metodę mu(). Bez trawy, krowa zwraca tekst, którego nie powinna zwracać. Chcemy temu zapobiec, więc robimy to tak:

  1. $k = new krowa($dla_krowy);
  2. if ($k->gotowa) echo $k->mu();



Wszystko zależy, czy błąd przy tworzeniu konstruktora ma tylko spowodować niewykonanie jakiś metod obiektu lub części kodu, czy ma położyć program. Bo jak ma położyć, a Ty albo user mają wiedzieć co się stało, to oczywiście throw new Exception('I tutaj co poszło nie tak....'); Na takie okazje przygotowałem sobie własne rozszerzenie klasy Exception, które wywala mi "pełen raport komisji śledczej".

Go to the top of the page
+Quote Post
tvister
post 1.12.2009, 08:55:26
Post #6





Grupa: Zarejestrowani
Postów: 253
Pomógł: 29
Dołączył: 18.08.2008

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


Z konstruktorem nie powalczysz.
Możesz zrobić loader coś w tym stylu
  1. klasa::zaladuj_obj()


Statyczna metoda zwracająca obiekt własnej klasy lub null-a.
Dodatkowo opisać phpdoc-em i vista wio.


--------------------
Kto rano wstaje ten leje jak z cebra.
Go to the top of the page
+Quote Post
skowron-line
post 1.12.2009, 09:10:57
Post #7





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Cytat(tvister @ 1.12.2009, 08:55:26 ) *
Statyczna metoda zwracająca obiekt własnej klasy

Czy to nie brzmi jak singelton ?


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
marcio
post 1.12.2009, 09:48:31
Post #8





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Cytat(skowron-line @ 1.12.2009, 09:10:57 ) *
Czy to nie brzmi jak singelton ?


Moze mu chodzi o cos a'la factory() z kohany.




--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
skowron-line
post 1.12.2009, 10:36:01
Post #9





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Cytat(marcio @ 1.12.2009, 09:48:31 ) *
Moze mu chodzi o cos a'la factory() z kohany.

A to tylko kohana stosuje wzorzec faktory ?
Edit a i factory nie zwaraca obiektu własnej klasy
factory

Ten post edytował skowron-line 1.12.2009, 10:38:46


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
darko
post 1.12.2009, 10:58:14
Post #10





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


To może wywołuj najpierw funkcję, w której będziesz sprawdzał czy wpis o podanym id jest w bazie, jeśli jest, to utwórz obiekt i zwróć go, np.
  1. class Test {
  2.  
  3. private $param = null;
  4.  
  5. public function __construct($param) {
  6. $this->param = $param;
  7. }
  8.  
  9. }
  10.  
  11. function create_class_conditionally($name, $arg = null) {
  12. $return = null;
  13. // zamień warunek na sprawdzanie w bazie
  14. if($arg > 0) {
  15. $return = call_user_func_array(array(new ReflectionClass($name), "newInstance"), $arg);
  16. }
  17. return $return;
  18. }
  19.  
  20. //print_r(create_class_conditionally("Test", 1));
  21. print_r(create_class_conditionally("Test", -1));
  22.  
  23. if(is_null(create_class_conditionally("Test", -1))) {
  24. echo "null!";
  25. }


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
Crozin
post 1.12.2009, 20:07:03
Post #11





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

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


Hmm... a mnie nadal zastanawia dlaczego wszyscy tak boją się tego wyjątku...?
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: 18.07.2025 - 01:47