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.