Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przeciążenie konstruktora
Forum PHP.pl > Forum > PHP
didit
Przepraszam, z góry być może głupie pytanie. Ale sporo czasu nad tym myślę i nie mam już pomysłów.

Chodzi mi rozwiązanie takiego problemu

  1. class Head
  2. {
  3. public $lang;
  4. public function __construct()
  5. {
  6. print "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"".$this->lang."\" lang=\"".$this->lang."\">";
  7. }
  8. }
  9.  
  10. $head = new Head();
  11. $head->title='nnnn';
  12.  


Pytanie jak przekazać do konstruktora wartości zmiennych zanim wykona się konstruktor.

Może zaplątałem się w moich kombinacjach, jeśli tak też proszę o info, że mnie pokopało.

Pozdrawiam forumowiczów
marcio
Ustaw parametry kontruktora i wywoluj go razem z argumentami.
Cytat
Pytanie jak przekazać do konstruktora wartości zmiennych zanim wykona się konstruktor.

Nie da sie tak konstruktor to pierwszy "mechanizm" ktory sie uruchamia gdy tworzymy obiekt.
!*!
  1. public function __construct($lang)
  2. {
  3. $this->lang = $lang;
  4. }
  5.  
  6. $o = new Lang('pl');
hedrazer
albo jakoś tak wink.gif

  1. class Head {
  2. protected $lang;
  3. protected $title;
  4.  
  5. public function setLang($set) {$this->lang=$set; return $this;}
  6. public function getLang() {
  7. if(!$this->lang)
  8. $this->lang = 'pl'; // default value
  9. return $this->lang;
  10. }
  11.  
  12. public function setTitle($set) { $this->title=$set; return $this; }
  13. public function getTitle() { return (string)$this->title; }
  14.  
  15. public function __construct($title=NULL,$lang=NULL) {
  16. $this->setLang($lang)->setTitle($tile);
  17. }
  18.  
  19. public function render() {
  20. $out = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">';
  21. $out .= '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="'.$this->getLang().'" lang="'.$this->getLang().'">';
  22. if($this->getTitle())
  23. $out .= '<title>'.$this->getTitle().'</title>';
  24.  
  25. return $out;
  26. }
  27.  
  28. public function __toString() { return $this->redner(); }
  29. }
  30.  
  31. $head = new Head('Tytul strony');
  32. /* lub
  33. * $head = new Head;
  34. * $head->setTitle('Tytul');
  35. *
  36. */
  37. echo $head->render();
  38. // lub poprostu
  39. // echo $head; // dzieki __toString();
didit
Dziękuję za utwierdzenie mnie, że kierunek myślenia był abstrakcyjny smile.gif
mindspeo
Abstrakcyjny więc poprawny:)
thek
Możesz jeszcze ciutkę abstrakcyjniej smile.gif
  1. public function __construct($default = array())
  2. {
  3. foreach($default AS $key => $value) {
  4. if(property_exists(__CLASS__ , $key)) {
  5. $this->$key = $value;
  6. }
  7. }
  8. }
W ten sposób możesz ustawić dowolną liczbę własności klasy, jeśli tylko znasz ich nazwy. No i w sumie jeśli nawet ktoś wpisze taką, której nie ma, to nic się nie stanie.

EDIT: Uwaga... Dopiero od 5.3 wyłapywane są inne zmienne niż publiczne! Wcześciejsze wersje PHP nie złapią własności prywatnych i protected.
cudny
  1. class Head {
  2. public $lang;
  3. public function __construct($lang) {
  4. $this->lang = $lang;
  5. print "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"".$this->lang."\" lang=\"".$this->lang."\">";
  6. }
  7. }
  8.  
  9. $head = new Head( 'en' );
  10. $head->title='nnnn';
  11.  
darko
Temat z przeciążaniem czegokolwiek ma wspólnego tyle, co nic.
cudny
Cytat(darko @ 11.10.2012, 08:37:14 ) *
Temat z przeciążaniem czegokolwiek ma wspólnego tyle, co nic.


A tutaj masz całkowitą racje biggrin.gif
thek
Akurat PHP i przeciążanie to faktycznie nieco niezbyt pasujące do siebie rzeczy. Przynajmniej jeśli chodzi o fakt znany z języków kompilowanych w stylu C++, gdzie metoda w obrębie klasy o tej samej nazwie, ale z inną ilością lub o innym typie parametrów, była już zupełnie inną metodą. PHP, który jest językiem dynamicznym, w tej roli miałby jednak pewne problemy.

Zgodzę się, że wspomniany problem to bardziej problem zasięgu widoczności i momentu inicjalizacji niż przeciążenia czegokolwiek.
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.