hey mensen,


ik heb 3 classes

<?php

class twitter_oauth{

public $var1

public function setVar1($var)
{
$this->var1 = $var;

}

}
class twitter_stream extends twitter_oauth
class twitter_tweet extends twitter_oauth

?>

ik heb dus een variable in de hoofdclass

<?php
$twitterauth = new twitter_oauth();

$thitterauth->setVar('hello')
?>

nu wil ik de waarde van die variable die ik heb geset gebruiken voor elke child

dus als ik in de andere classes $this->var1 gebruik werkt dat niet

ik moet ze altijd setten in de child zelf

hoe kan ik dat aanpakken dat ik die enkel kan setten in main class en dan verwijzen naar de $var1 in main class?
Dat kan niet. De drie instanties zijn drie op zichzelf staande objecten, met hun eigen stukje geheugen en hun eigen waardes voor de variabelen.

Als je wil dat bepaalde gegevens altijd in een object geset worden dan moet je dat doen via een factory of service container die bij het aanmaken de properties set.
voor twitter heb je aantal keys nodig voor te authen

nu wil ik dat ik 1 x de keys set in het begin

en dat elke class die kan gebruiken voor te authen.

nu ik per class die keys appart setten maar die zijn dezelfde.

kan je me opweg helpen?
Als je drie instanties van je class hebt, dan zal je linksom of rechtsom drie keer die gegevens moeten injecteren. Tenzij je het hardcoded in de constructor doet, maar dat lijkt me een zeer slecht idee, want dan kan je het nooit meer voor een andere applicatie met andere Twitter keys gebruiken.

Dus of injecteert het in een property, of je injecteert het via de constructor, of je maakt een config object (met daarin de keys, de secrets, de service urls etc) en injecteert dat object. Maar hoe dan ook zal je dat voor elke instantie moeten doen.
agja mss is het ook wel logisch dat elke instantie zijn keys moet setten, wie weet heb je ooit eens een situatie dat bv twitterstream clas andere keys heeft dan de tweet opzich.

het is inderdaad ook de bedoeling code te re-usen. dus ik laat het zo

thx
ik denk dat ik zo iets zou doen maar ik zou van bijv. Erwin wel eens willen weten of hij dit zo bedoeld.

config.class.php:
<?php
class Config {

var $twitter_auth_key = 123456789;
var ...

};

$config = new Config();
?>

twitter.class.php:
<?php
include_once 'config.class.php';

class twitter_oauth{

public $var1;

__construct($config) {
$this->var1 = $config->twitter_auth_key;
}

};
?>
Nooit public of var in je objecten gebruiken(!)

Verder denk ik dat dat erwin's idee is.


Ik zou de DI container gebruiken:
<?php
class Twitter_OAuth
{
private $apiKey;

public function __construct($key)
{
$this->apiKey = $key;
}
}

$container->set('twitter.api_key', 'adgy319ygda976g2q');
$container->set('twitter.oauth.class', 'Twitter_OAuth');

$container->set('twitter.oauth', function ($c) {
return new ($c->get('twitter.oauth_class'))($c->get('twitter.api_key'));
});

// in gebruik:
$oauth = $container->get('twitter.oauth');
?>
Dat is inderdaad ook hoe ik het heb. Met in dat config object dan ook nog de urls, de secrets en de tokens.
Dit config object zal je dan wel bij elke nieuwe instantie die je aanmaakt moeten injecteren (zoals je nu doet in de constructor). Op zich hoef je dan maar op 1 plek de gegevens te hebben, namelijk op de plek waar je dat config object aanmaakt, maar het config object blijf je drie keer injecteren. Daar ontkom je niet aan.

Enige is dat ik niet de gegevens hardcoded in het config object heb, maar dat terzijde.
@wouter: Ik ben het op zich eens met de stelling dat properties niet publiek moeten zijn maar ik dacht dat het voor die config niet zo een vaart zou lopen. Maar je hebt gelijk. Die container is een symfony object? en hoe ziet een simpele vorm van die klas er uit?

@erwin: waar bewaar jij je config-gegevens dan?

Bedankt voor de reacties. Frank.
Die config gegevens moeten door de applicatie ingegeven worden. Dat kan uit een database komen, kan uit een applicatie config object komen, kan ook in hardcoded applicatie constante zitten.
Mijn Oauth config class is een algemene class die dus niet applicatie specifieke gegevens in zich heeft zitten.

Reageren