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
darko
post
Post #2





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

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


Przypomnę wam przykładową implementację singletona w php i tutaj ~jajcarzd1 opis dokładniej swój problem, ba aktualnie nie jest jasne, w czym jest problem, czy chodzi Ci o dziedziczenie po klasie będącej singletonem czy może o coś innego.
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(darko @ 7.05.2010, 12:10:21 ) *
Przypomnę wam przykładową implementację singletona w php i tutaj ~jajcarzd1 opis dokładniej swój problem, ba aktualnie nie jest jasne, w czym jest problem, czy chodzi Ci o dziedziczenie po klasie będącej singletonem czy może o coś innego.


Ok powtórzę jeszcze raz. Mam klasę bazową i klasę potomną jak poniżej

  1. abstract class A {
  2.  
  3. public function __construct() {
  4. echo "konstruktor nadrzędny";
  5. }
  6.  
  7. }
  8.  
  9. class B extends A {
  10.  
  11.  
  12. private static $_instance;
  13.  
  14. public static function instance() {
  15.  
  16. if (null === self::$_instance) {
  17. self::$_instance = new self();
  18. }
  19.  
  20. return self::$_instance;
  21. }
  22.  
  23.  
  24.  
  25. }


Zależy mi na tym aby klasa potomna była tylko w jednej instancji dlatego wykorzystuję singletona sobie i metodę
  1. $b = B::instance()


no ale w wypadku powyższym ktoś będzie również mógł stworzyć drugą instancję klasy B według sposobu poniżej a tego chciałbym uniknąć

  1. $b = new B()


dlatego chciałem dodać do klasy potomnej konstruktor ale już jako protected aby nie była możliwa do odpalenia konstrukcja $b = new B() no ale jak dodam go to mam wtedy oczywiście błąd Access level to B::__construct() must be public (as in class A) bo jest niższy poziom konstruktora.
Myślę że jasno pokazałem oco mi chodzi.
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: 14.10.2025 - 02:20