Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kontruktor chroniony a dziedziczenie
Forum PHP.pl > Forum > PHP
jajcarzd1
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 ?
zend
Nie lepiej konstruktor w abstrakcyjnej klasie bazowej potraktować jako publiczny, a potem w singletonach nadpisywać go prywatnym, a w zwykłych klasach konstruktor będzie traktowany normalnie?
jajcarzd1
Cytat(zend @ 7.05.2010, 09:41:29 ) *
Nie lepiej konstruktor w abstrakcyjnej klasie bazowej potraktować jako publiczny, a potem w singletonach nadpisywać go prywatnym, a w zwykłych klasach konstruktor będzie traktowany normalnie?


Nie bardzo wiem co masz na myśli no bo przecież w klasie dziedziczącej nie możesz dać zakresu niższego niż w dziedziczonej.
zend
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
jajcarzd1
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)"
darko
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.
jajcarzd1
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.
zend
We wszystkich klasach które mają być singletonami MUSISZ stworzyć prywatny konstruktor, sam widzisz że metoda którą podałeś nie działa, to po co w nią brniesz?
jajcarzd1
Cytat(zend @ 7.05.2010, 16:24:08 ) *
We wszystkich klasach które mają być singletonami MUSISZ stworzyć prywatny konstruktor, sam widzisz że metoda którą podałeś nie działa, to po co w nią brniesz?


No wiem że nie działa dlatego pytam jaką macie sugestię dla ominięcia tego problemu i czy uda się to jakoś ominąć albo zastosowac podobne rozwiązanie. Czyli zabezpieczenia klasy potomnej przed stworzeniem instacji żeby był mozliwy tylko singletone z jednoczesną możliwościa zasotosowania konstruktora w klasie dziedziczonej
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.