NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!

Diskuze – Lekce 4 - Zapouzdření v PHP

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Odpovídá na Petr Škopek
Martin Konečný (pavelco1998):19.8.2017 18:01

Tu proměnnou $doba dostane metoda spi() parametrem.
Takže třeba

$clovek->spi(20);

Pak v proměnné $doba bude číslo 20

Odpovědět
19.8.2017 18:01
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Ondřej Vaňkát:25.5.2020 7:58

Má private, protected, public nějaký vliv na napadeni aplikace z venku ? Například mi někdo nabourá aplikaci, protože jsem nějakou metodu/atribut dal public.
Díky

 
Odpovědět
25.5.2020 7:58
Avatar
Pavel Kubalík:11.1.2021 15:06

Dobrý den
Jelikož, je tato lekce trochu jednodušší vrátil jsem se k vzorovému řešení minulého třetího (pokročilejšího) příkladu. Měl jsem z toho komplex méněcennosti. Bude úspěch když někdy řešení zcela pochopím (v hrubých rysech to chápu). Fakt je, že to vymýšlí špičkoví programátoři ČR a to já zdaleka nejsem a ani už nebudu.
Rovněž jsem se podíval na další příklady a nejsem si jist jak je zvládnu. Rozhodně musím velmi a velmi zpomalit a hodně přemýšlet. Nevím, nevím zda to zvládnu.
Trochu jsem se rozveselil, když jsem si vzpomněl na ukončení základního kurzu PHP. Když jsem dokončil svůj první kurz (SQLite) přišel mi email. Nyní nic (asi se to normálně nenosí). Těšil jsem se na certifikát, který byl slibován, když vyřeším všechny povinné (!) příklady, ale nic. Já k ničemu žádný papír nepotřebuji, ale jak to vysvětlit mým dětem a vnoučatům (pravnučky zatím mají jiné starosti). Snažím se však myslet pozitivně. Každopádně moje důvěra způsobila, že jsem se všem těmto příkladům věnoval, a něco se naučil. Že je to ztráta důvěry. A co? To je dnes normální. Účel světí prostředky. Takže hlavu vzhůru, zpomalit, zatnout zuby a pokračovat.
Děkuji PK

 
Odpovědět
11.1.2021 15:06
Avatar
t.teichmanova:22.4.2021 19:55
Opět jsem si s Vašim programem trochu pohrála a zkusila jej trochu modifikovat.
<?php
class Clovek
{
    public $jmeno;
    public $prijmeni;
    public $vek;
    private $unava = 0;

    public function __construct($jmeno, $prijmeni, $vek)
    {
        $this->jmeno = $jmeno;
        $this->prijmeni = $prijmeni;
        $this->vek = $vek;
    }

    public function behej($vzdalenost)
    {
        if ($this->unava + $vzdalenost >= 20){
                 echo('Jsem příliš unavený.<br>');
                }else{
                  echo "Jsem v pohodě.<br><br>";
          }
}
    public function pozdrav()
    {
        echo('Ahoj, já jsem ' . $this->jmeno . "<br>");
    }

    public function __toString()
    {
        return $this->jmeno;
    }

}

$karel = new Clovek('Karel', 'Novák', 10);
$jan = new Clovek('Jan', 'Nový', 24);

$karel->pozdrav();
$karel->behej(5);

$jan->pozdrav();
$jan->behej(30);


?>

   Zdravím a přeju krásné dny

                                                               T.T.
 
Odpovědět
22.4.2021 19:55
Avatar
t.teichmanova:29.4.2021 21:19
 Ještě jednou jsem se pročítala touto lekci, kde se uvádí rozhraní-interface. V programu ale neni nebo jsem ho tam možná nenašla, tak jsem jej tam přidala. Snad jsem neporušila autorská práva při úpravě Vašeho programu.
  Zde je moje trochu upravená verze :

<?php
interface Demo {
 public function technologie();
 }

class Clovek   implements Demo
{
    public $jmeno;
    public $prijmeni;
    public $vek;
    private $unava = 0;

    public function __construct($jmeno, $prijmeni, $vek)
    {
        $this->jmeno = $jmeno;
        $this->prijmeni = $prijmeni;
        $this->vek = $vek;
    }

    public function  technologie(){
      echo "Dávám přednost hartware";
   }

    public function behej($vzdalenost)
    {
         if ($this->unava + $vzdalenost <= 20){
            $this->unava += $vzdalenost;
            echo( 'Jsem v pohodě.');
         }else{
            echo('Jsem příliš unavený.');
         }
    }

    public function pozdrav()
    {
        echo('Ahoj, já jsem ' . $this->jmeno .' ' .$this->prijmeni.' a je mi '.$this->vek.' let.<br>');
    }


    public function __toString()
    {
        return $this->jmeno;
    }
}

class Javista extends Clovek  implements Demo
{
    public $ide;
    public function __construct($jmeno, $prijmeni, $vek, $ide)
    {
        $this->ide = $ide;
        parent::__construct($jmeno, $prijmeni, $vek);
    }

     public function  technologie(){
      echo "Dávám přednost software";
   }


    public function programuj()
    {
        echo("Programuji v $this->ide .");
    }
}
        $karel = new Clovek('Karel', 'Novák', 30);
        $karel->pozdrav();
        $karel->behej(10);
        echo('<br>');
        $karel->technologie();
        echo('<br>');

        $jan = new Javista('Jan', 'Nový', 24, 'C_Plus');
        echo('<br>');
        $jan->pozdrav();
        $jan->behej(30);
        echo('<br>');
        $jan->technologie();
        echo('<br>');
        $jan->programuj();
 ?>

      Zdraví a krásne dny přeje
                                                             T.T.
 
Odpovědět
29.4.2021 21:19
Avatar
Petr
Člen
Avatar
Petr:30.4.2021 9:45

Což takhle začít využívat novinky php8.
Definice atributů třídy v konstruktoru.
Místo...
public $jmeno;
použít definici v konstruktoru...

public function __construct($jme­no,...
public string $jmeno = $jmeno, ... atd

Usetříme spoustu řádků v deklaracích.

 
Odpovědět
30.4.2021 9:45
Avatar
Milan Turyna
Tvůrce
Avatar
Odpovídá na Petr
Milan Turyna:3.5.2021 8:28

PHP 8 ještě není podporované na mnoha hostingách (myslím, že např. Forpsi) a proto by některé začátečníky mohlo zmást, proč jim kód v lekci nefunguje. Proto si myslím, že je zatím lepší volbou, použití starší metody, která je podporovaná všude. Nebylo by ale od věci napsat více kódů (pro všelijaké verze) a jako uživatel mít možnost rozkliknout si svojí verzi.

Odpovědět
3.5.2021 8:28
Řeš pouze to, co dokážeš ovlivnit.
Avatar
Josef N.
Člen
Avatar
Odpovídá na Pavel Kubalík
Josef N.:26.2.2022 18:09

Ahoj,

po nahrání vzorové třídy a programu index.php to hlásí chybu. Jsou tam přehozeny deklarace PUBLIC a PRIVATE.

Zde uvádím upravené a funkční řešení (testováno na PHP 7.4.3):

<!-- soubor index.php -->
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="utf-8" />
<title>Práce s instancemi třidy Clovek ($karel a $jan)</title>
</head>
<body>
<?php
  require_once "tridy/Clovek.php";
  $karel = new Clovek('Karel', 'Novák', 30);
  $jan = new Clovek('Jan', 'Nový', 24);

  echo "Já jsem ".$jan."<br />";
  echo "Já jsem ".$karel."<br />";

  $karel->pozdrav();
  $jan->pozdrav();

  $jan->behej(10);
  $jan->behej(10);
  $jan->behej(10);

  $karel->spi(1);
  $karel->unava = 20;
  $karel->behej(10);
?>
</body>
</html>

A zde třída Clověk:

<?php
// třída, soubor Clovek.php
class Clovek {

    private
      $jmeno, $prijmen, $vek;
    public
      $unava = 0;

    public function __construct($jmeno, $prijmeni, $vek) {
      $this->jmeno = $jmeno;
      $this->prijmeni = $prijmeni;
      $this->vek = $vek;
    }

    public function spi($doba) {
      $this->unava -= $doba * 10;
      if ($this->unava < 0) $this->unava = 0;
    }

    public function behej($vzdalenost) {
      if ($this->unava + $vzdalenost <= 20)
        $this->unava += $vzdalenost;
      else
        echo("Jsem příliš unavený. ".$this."<br />");
    }

    public function pozdrav() {
      echo('Ahoj, já jsem ' . $this->jmeno." ".$this->prijmeni." a mám ".$this->vek." roků.<br />");
    }

    public function __toString() {
      return $this->jmeno." ".$this->prijmeni;
    }

}
Odpovědět
26.2.2022 18:09
Ne estas pano sen laboro!
Avatar
Josef N.
Člen
Avatar
Josef N.:26.2.2022 18:43

Pozor,
v předcházejím mém kódu je ukrytá velmi zákeřná chyba.
Je to:

private
     $prijmen;

Chybí "i" tedy mělo být:

private
      $jmeno, $prijmeni, $vek;

Ale takový překlep způsobí to, že v kontruktoru je v

$this->prijmeni = $prijmeni;

založen veřejný atribut třídy (proměnná) prijmeni !

Odpovědět
26.2.2022 18:43
Ne estas pano sen laboro!
Avatar
Odpovídá na Josef N.
Pavel Kubalík:27.2.2022 9:19

Ahoj
Děkuji a příležitostně prostuduji
PK

 
Odpovědět
27.2.2022 9:19
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 53.