Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Kontruktor chroniony a dziedziczenie
jajcarzd1
post
Post #1





Grupa: Zarejestrowani
Postów: 215
Pomógł: 19
Dołączył: 24.12.2003
Skąd: Przemyśl

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


Witam ponownie

Mam pewien problem. Otóż mam coś takiego

  1. abstract class A {
  2.  
  3. protected function __construct() {
  4. echo "konstruktor nadrzędny";
  5. }
  6.  
  7. protected function x() {
  8. echo "show";
  9. }
  10.  
  11. }
  12.  
  13. class B extends A {
  14.  
  15. public function y() {
  16.  
  17. }
  18. }
  19.  
  20. $b = new B();


Mam pewną klasę "A" która jest bazową klasą po której dziedziczą inne. Sęk w tym że dając jakąś metodę jako "protected" w klasie dziedziczonej jest ona normalnie dostępna w klasie dziedziczącej. Jeżeli natomiast konstruktor dam w klasie dziedziczonej dam jako protected no to niestety już instancji klasy "B" nie uda mi się stworzyć bo dostaję:

  1. Fatal error</b>: Call to protected B::__construct() from invalid context


choć sądziłem że powinno to być ok. Dopiero gdy zastosuję w klasie "B" jawne wywołanie publicznego konstruktora to jest ok

  1. class B extends A {
  2.  
  3. public function __construct() {
  4. parent::__construct();
  5. }
  6. public function edit() {
  7.  
  8. }
  9. }


Sęk w tym że niektóre klasy dziedziczące będą singletonami i chcę żeby miały tylko jedną instancję dlatego chciałbym w nich dać konstruktor protected

  1. protected function __construct() {}


no ale niestety jak widac nie mogę tego zastosować choć sądziłem że powinno być ok.

Będ wdzięczny za poradę

Dodam jeszcze że w manualu jest wypowiedź jakiegoś usera http://www.php.net/manual/en/language.oop5.decon.php#79986 który podaje coś takeigo

  1. abstract class AAbstract {
  2.  
  3. // Protected Constructor ...
  4. // Abstract Class Can Not Be Created Anyway ...
  5. // No Problems Here.
  6.  
  7. protected function __construct( ) {
  8.  
  9. }
  10.  
  11. // Class Function ...
  12. // Originally In Class A ...
  13. // Which Was Used As A Super Class.
  14.  
  15. public function functionA( ) {
  16.  
  17. }
  18. }
  19.  
  20. class C extends AAbstract {
  21.  
  22. // Protected Constructor ...
  23. // Same As Parent Class ...
  24. // Again No Problems Here.
  25.  
  26. protected function __construct( ) {
  27.  
  28. }
  29.  
  30. // Class Function ...
  31. // Specific To This Class.
  32.  
  33. public function functionC( ) {
  34.  
  35. }
  36. }


czyli tak jak ja chciałem to osiągnąć i według niego to niby działa.

No to jak tam nikt mi nic nie pomoże ?

Ten post edytował jajcarzd1 6.05.2010, 14:52:37
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
zend
post
Post #2





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

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


O to mi chodziło
  1. abstract class Basic
  2. {
  3. public function __construct()
  4. {}
  5. }
  6.  
  7. class MySingleton extends Basic
  8. {
  9. protected function __construct()
  10. {
  11. return parent::__construct();
  12. }
  13.  
  14. static public function getInstance()
  15. {
  16. }
  17. }
  18.  
  19. class EasyToCreate extends Basic
  20. {
  21. }
  22.  
  23. $c = new EasyToCreate();
  24. $s = MySingleton::getInstance();


W klasie dziedziczącej można nadpisać konstruktor z innym kfantyfikatorem dostepu np public i wywołać w nim konstruktor klasy bazowej

Ten post edytował zend 7.05.2010, 10:07:50
Go to the top of the page
+Quote Post
jajcarzd1
post
Post #3





Grupa: Zarejestrowani
Postów: 215
Pomógł: 19
Dołączył: 24.12.2003
Skąd: Przemyśl

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


Cytat(zend @ 7.05.2010, 11:02:29 ) *
protected function __construct()
{
return parent::__construct();
}


[/php]


No ale przeciez to Ci nie odpali bo masz konstruktor protected a w dziedziczonej masz public i dostajesz błąd "Access level to MySingleton::__construct() must be public (as in class Basic)"
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 12.10.2025 - 11:47