[PHP] Inheritance en visibility constructor levert problemen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
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:
  • 0 Henk 'm!

  • harrald
  • Registratie: September 2005
  • Laatst online: 08-09 13:35
static:$storage moet zijn: self::$storage.

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

Acties:
  • 0 Henk 'm!

  • martijnve
  • Registratie: December 2004
  • Laatst online: 11-09 13:55
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:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@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 Verwijderd op 17-06-2012 17:14 ]


Acties:
  • 0 Henk 'm!

  • harrald
  • Registratie: September 2005
  • Laatst online: 08-09 13:35
Verwijderd 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:
  • 0 Henk 'm!

Verwijderd

Topicstarter
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 Verwijderd op 17-06-2012 17:25 ]


Acties:
  • 0 Henk 'm!

Verwijderd

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?

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Verwijderd 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}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@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