Funkce nechce zdědit hodnoty
- edas229
- Člen | 13
Ahoj, dělám api s ožností vícejazyčných outputů, ale narazil jsem na problém. Konkrétně je poslán request a presenter ho pošle třídě Main na zpracování. Ta nastaví jazyk odpovědi a zavolá se podle switche zavolá příslušnou funkci z jiné classy, která by měla zdědit funkce abstraktní třídy, která už má v tuto chvíli nadefinovaný jazyk odpovědí. Bohužel zde to selže, abstraktní třída ještě s jazykem pracovat může, ale ta co ji dědí již ne. Níže je kód, snad jsem to popsal aspoň trochu srozumitelně :D
Presenter
/** @var Main */
private $main;
public function __construct(Main $main)
{
$this->main = $main;
}
public function renderDefault(){
if(!$this->main->setLanguage($data['queryResult']['languageCode'])){
$this->throwError(ErrorMessages::NO_DATA_SENT_400, \Nette\Http\IResponse::S400_BAD_REQUEST);
}
$message = $this->main->getOutput($data['queryResult']['action'], $data);
}
Main.php
/** @var Youtube */
private $youtube;
private $language;
public function __construct(Youtube $youtube)
{
$this->youtube = $youtube;
}
public function setLanguage($lang){
$lang = str_replace("-", "", $lang);
$fileName = __DIR__."/../lang/".$lang.".php";
if (file_exists($fileName)){
$lang = "\App\Lang\\$lang";
$this->language = new $lang();
}
else{
$this->language = new \App\Lang\enUS();
}
if(!empty($this->language)){
new Language($this->language);
return True;
}
else{
return False;
}
}
public function getOutput($action, $data){
switch($action){
case "getYoutubeChannelSubscribers":
$message = $this->youtube->channelStats($data, "subscriberCount");
break;
default:
$message = $this->language->errorActionNotFound;
}
return $message;
}
Language.php
class Language extends Inhert
{
public function __construct($language){
$this->setLanguage($language);
}
}
Inhert.php
abstract class Inhert
{
protected $language;
protected function setLanguage($language){
$this->language = $language;
}
}
Youtube.php
final class Youtube extends Inhert
{
public function channelStats($data, $stats){
exit($this->language->error); //tento řádek už nefunguje
}
Ve třídě Inhert funguje $this->language->error v pořádku a vrací požadovanou frázi, ale v třídě youtube už ne? Lámu si s tím hlavu už 3. den, tak bych potřeboval pomoci :D
- David Matějka
- Moderator | 6445
Ahoj, ani to tolik nesouví s dědičností, ale s tím, že jsi špatně pochopil OOP.
Ta data jsou spojena s konkrétní instancí třídy. Když je tedy nastavíš na jednom objektu (v tvém případě Language), tak nemohou být vidět v jiném objektu (v tvém případě Youtube). Ale i pokud by to byla dvě instance stejné třídy, tak to nebude fungovat.
a tento problém ani příliš nesouvisí s nette. doporučuju spíš forum djpw.cz
- edas229
- Člen | 13
@DavidMatějka Díky! Ještě mám otázku, zkusil jsem upravit třídu inhert a vynechat kompletně třídu language. Výsledek mám však stejný a pořád po zavolání v třídě youtube vrací null. Chápu to pořád špatně? :D
class Inhert
{
protected $language;
public function __construct($language){
$this->language = $language;
}
}