Toon posts:

[PHP] Inheritance en visibility constructor levert problemen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0Henk 'm!

  • Ruban
  • Registratie: januari 2005
  • Laatst online: 26-09-2016
Ik heb een - in mijn inziens - raar probleem met inheritence tussen twee classes en verschillende visibility tussen de constructors van deze classes. Ik ben bezig met het in elkaar zetten van wat classes die me kunnen helpen met Dependency Injection.

Ik heb een Container class, die simpelweg een interface biedt om variabelen op te slaan en te vragen. De constructor van deze class is public. De class die de Container class extend heet ServiceContainer en is bedoelt te gebruiken als Singleton (constructor uit het zicht met een statische methode om de class zelf te callen), zodat ik overal de ServiceContainer kan aanspreken.

Nu het probleem: Zodra ik de ServiceContainer aanroep dmv ServiceContainer::init(args) en bij beide classes de visibility van de constructors verschilt, valt PHP in stilte dood. Ik krijg geen waarschuwing oid.

De classes:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Container implements \ArrayAccess
{
    protected $values;

    public function __construct (array $values = array())
    {
        $this->values = $values;
    }
/* ... */
}

class ServiceContainer extends Container 
{
    protected static $instance;
    protected $storage;

    protected function __construct($storage)
    {
        $this->storage = $storage;
    }
    
    public static function init(ServiceStorageInterface $storage)
    {
        return static::$instance = new static($storage);
    }
    
    public static function getInstance()
    {
        if ( ! isset(static::$instance)) { 
            throw new Exception('ServiceContainer is not initialized');
        }
        return static::$instance;
    }
/* ... */
}


Iemand die me opweg kan helpen?

Acties:
  • 0Henk 'm!

  • harrald
  • Registratie: september 2005
  • Laatst online: 29-10 19:13
static:$storage moet zijn: self::$storage.

En new static? hoe ben je op deze code gekomen?

Acties:
  • 0Henk 'm!

  • martijnve
  • Registratie: december 2004
  • Laatst online: 02-12 01:19
Als je een method (je constructor) override mag je die niet minder "visible" maken (van public naar protected). Als je je error reporting hoger zet zul je daar ook een nette foutmelding van krijgen.

edit:
Een ServiceContainer is immers een Container en zou dus als zodanig gebruikt moeten kunnen worden inclusief de constructor.

Dit is dus geen php-probleem maar een ontwerpfout. Als je laat zien wat je met de Container precies wil doen kunnen we een betere oplossing proberen te verzinnen.

edit2:
@harrold:
static:$storage en self::$storage zijn hele andere beestjes en New Static werkt idd.

[Voor 54% gewijzigd door martijnve op 17-06-2012 17:14]

Mini-ITX GamePC: Core i5 3470 | 16GB DDR3 | GTX 970 4GB | Samsung 830 128GB | Dell u2711 (27", IPS,1440p), 2343BW


Acties:
  • 0Henk 'm!

  • Ruban
  • Registratie: januari 2005
  • Laatst online: 26-09-2016
@harrald: Uit de php (5.3+) documentatie heb ik begrepen dat dit gewoon mogelijk is

@martijve: Mijn error_reporting ziet er als volgt uit:

PHP:
1
2
ini_set('display_errors', 1);
error_reporting(-1);


Ik dacht zelf dat dit de strengste error_reporting was, maar ga er even naar kijken

Edit

@martijnve: haha ja dat is een beetje het probleem, de ServiceContainer gebruik ik regelmatig dmv ::getInstance, maar zelf heb ik geen gebruik gemaakt van de Container class (Heb 't afgekeken van een DI framework).

[Voor 27% gewijzigd door Ruban op 17-06-2012 17:14]


Acties:
  • 0Henk 'm!

  • harrald
  • Registratie: september 2005
  • Laatst online: 29-10 19:13
Ruban schreef op zondag 17 juni 2012 @ 17:10:
@harrald: Uit de php (5.3+) documentatie heb ik begrepen dat dit gewoon mogelijk is

@martijve: Mijn error_reporting ziet er als volgt uit:

PHP:
1
2
ini_set('display_errors', 1);
error_reporting(-1);


Ik dacht zelf dat dit de strengste error_reporting was, maar ga er even naar kijken

Edit

@martijnve: haha ja dat is een beetje het probleem, de ServiceContainer gebruik ik regelmatig dmv ::getInstance, maar zelf heb ik geen gebruik gemaakt van de Container class (Heb 't afgekeken van een DI framework).
Sorry 8)7
Heb mezelf even bijgelezen. Vind het er wel heel erg vreemd uitzien though :+

Acties:
  • 0Henk 'm!

  • Ruban
  • Registratie: januari 2005
  • Laatst online: 26-09-2016
Ja klopt, 't ziet er vreemd uit. Maar met self kunnen er met inheritence onwenselijk dingen gebeuren met de parents, dus vandaar de late static binding.

@martijnve en de rest van de lezers:

Ik denk dat het de beste oplossing is om de relatie tussen de twee classes om te draaien of om de Container class helemaal achterwege te laten, omdat ik er in mijn huidige situatie geen gebruik van maak.

Heb ook even de error reporting nagekeken, maar het moet goed zijn zo. Toch vreemd dat ik geen error krijg

[Voor 54% gewijzigd door Ruban op 17-06-2012 17:25]


  • lfs
  • Registratie: juni 2005
  • Laatst online: 24-11-2017
Als je in PHP een nieuw object maakt dan wordt de constructor aangeroepen van dat object maar niet de constructor van de parent class, die moet je nog expliciet aanroepen met parent::__construct();. Ik weet niet of dat is wat je probleem veroorzaakt of wat je bedoelt?

  • Voutloos
  • Registratie: januari 2002
  • Niet online
Ruban schreef op zondag 17 juni 2012 @ 17:21:
Heb ook even de error reporting nagekeken, maar het moet goed zijn zo. Toch vreemd dat ik geen error krijg
Het maakt ook uit hoe je die settings wijzigt. Als je dat bijvoorbeeld in een file met syntax fout zelf doet, wordt dat niet uitgevoerd en zie je alsnog niets.

En anders moet je in de error log kijken.

{signature}


  • Ruban
  • Registratie: januari 2005
  • Laatst online: 26-09-2016
@Ifs: Ik hoef geen dingen uit de constructor van de parent over te nemen, het was inderdaad zoals martijnve zei dat je een override niet minder visible mag maken.

@Voutloos: Ik gebruik bij dit framework het fusebox principe en vrijwel aan het begin van de fusebox wordt de error_reporting aangepast, dus dat zou niet het probleem moeten zijn. Alles voor error logging staat aan maar toen ik de file wilde bekijken bestond de log niet eens :/, dus daar ben ik niet veel wijzer van geworden :+. Nu natuurlijk wel even goed bijhouden.
Pagina: 1


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee