Portál AbcLinuxu, 10. května 2025 19:44

Dotaz: prepisovani funci - php

1.3.2013 17:18 Pavel80
prepisovani funci - php
Přečteno: 748×
Odpovědět | Admin

Ahoj, je mozne prepsat funkci? Něco jako bych si vytvořit instanci třídy Kniha, a chtěl aby mi vždy vracela jako název nastavený text. Nějak podobne jako to lze třeba v javě?
$kniha = new Kniha() {
public function getNazev() {
return "novy nazev";
}
}

a potom vždy když by se zavolalo: $kniha->getNazev() dostal bych "novy nazev". Je neco takoveho v php mozne? a jak na to? díky.

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Tarmaq avatar 1.3.2013 17:28 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: prepisovani funci - php
Odpovědět | | Sbalit | Link | Blokovat | Admin
class Kniha
{
  public function getNazev()
  {
    return "novy nazev";
  }
}
$kniha = new Kniha();
echo $kniha->getNazev();
Predpokladam ale, ze ten nazev tam chces strkat zvenku:
class Kniha
{
  public function __construct($nazev)
  {
    $this->nazev = $nazev;
  }
  private $nazev;
  public function getNazev()
  {
    return $this->nazev;
  }
}
$kniha = new Kniha("novy nazev");
echo $kniha->getNazev();
Don't panic!
1.3.2013 17:28 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: prepisovani funci - php
Odpovědět | | Sbalit | Link | Blokovat | Admin
Cože?
<?php
class Kniha{
  private $name;
  public function __construct($name) {
    $this->name = $name;
  }
  public function getName(){
    return $this->name;
  }
}
$kniha = new Kniha("Alenka v říši divů");
echo $kniha->getName();
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
1.3.2013 18:06 Pavel80
Rozbalit Rozbalit vše Re: prepisovani funci - php
Odpovědět | | Sbalit | Link | Blokovat | Admin
díky, ale tohle jsem zrovna nemyslel. Právě ani nevím, jestli to, co chci, php umí.

1)
Budu mít třídu kniha - nechci do ní nic setovat přes konstruktor ani přes žádnou jinou funkci.
Pak budu mít třídu Knihovna, ve které je vytovřena instance třídy Kniha.
Pouze v té třídě Knihovna chci, aby funkce getNazev() z třídy Kniha vždy vracela třeba "XXX". Takže pouze pro tuto instanci knihy chci upravit fungování funkce getNazev().

2)
Nebo pokud bych to vzal přes jiný příklad s abstraktní funkcí. Kniha bude abstraktní třída a getNazev() bude abstraktní funkce.
Je možné vytvořit v php instanci abstraktní třídy Kniha bez toho, abych si nejprve vytvořil třídu "KnihaImplementace extends Kniha"? Ale přímo s tou abstraktní třídou udělal $kniha = new Kniha() a nyní ji teprve nějak doimplementoval fungování metody getNazev()? Doimplemetoval bych tedy tu funkci getNazev teprve ve třídě Knihovna (případně všude, kde by byla vytvářena její nová instance).
1.3.2013 18:48 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: prepisovani funci - php
Jo tyhle prasárny :), nevím od které verze:
<?php
date_default_timezone_set('Europe/Prague');

class Kniha{
  private $name;
  public function __construct($name) {
    $this->name = $name;
  }

  public function __call($method, $args){
    if(isset($this->$method)){
      $func = $this->$method;
      $func($args);
    }
  }

  public function getName(){
    return $this->name;
  }
}

$kniha = new Kniha("Alenka v říši divů");
echo $kniha->getName(),"
\n"; $kniha->prnOnTheFly = function(){ echo "Alenka flying"; }; $kniha->prnOnTheFly(); echo "
\n"; $kniha2 = new Kniha("Alenka v říši divů 1½"); $kniha2->prnOnTheFly();//nic se nestane echo "
\n";
Ale je to zjednodušené a může to mít nějaké vedlejší efekty viz __call.
Nemám s tím zkušenosti, takže to nebudu ladit…
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
1.3.2013 20:31 Pavel80
Rozbalit Rozbalit vše Re: prepisovani funci - php
To asi budu to, co jsem chtěl. Díky.
2.3.2013 12:47 Logik
Rozbalit Rozbalit vše Re: prepisovani funci - php
Hmmm, nechtěl bys sem dát konkrétní případ, co řešíš? Zdá se mi totiž, že pokud toto potřebuješ, tak máš s dost velkou pravděpodobností chybu v návrhu.

Pokud chceš dělat takovýdle opičárny s libovolnou knihou, proč v třídě kniha rovnou neuděláš podporu pro to, co tam pak chceš za běhu "dohackovat"? Pokud to chceš dělat pouze s knihama v knihovně, proč si neuděláš potomka knihy, kde to vyřešíš elegantně?

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.