Funkce nechce zdědit hodnoty

edas229
Člen | 13
+
0
-

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
+
0
-

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
+
0
-

@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;
    }

}
CZechBoY
Člen | 3608
+
0
-

K čemu vlastně slouží tahle část?

if(!empty($this->language)){
    new Language($this->language);
edas229
Člen | 13
+
0
-

@CZechBoY Pokud by se nějak záhadně nic nenačetlo do $this->language, tak aby to stoplo a hodilo chybu

edas229
Člen | 13
+
0
-

Tak jsem to vyřešil tak, že prostě v třídě youtube mají funkce ještě třetí parametr language a tam ho prostě do každé jednotlivé sázím. Kdyby někdo měl elegantnější řešení, tak prosím poraďte :D

CZechBoY
Člen | 3608
+
0
-

@edas229 Jak se to může stát když v v obou (if+else) případech plníš property?

CZechBoY
Člen | 3608
+
+1
-

Určitě je lepší mít to jako parametr, máš více stateless aplikaci.