Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

Diskusia – 3. diel - Atribúty a magické metódy v PHP

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Odpovedá na Dominik Gavrecký
Martin Konečný (pavelco1998):4.7.2015 0:35

Public se používá v podstatě ve dvou případech:

  1. hodnotu vlastnosti nastavujeme odjinud (třeba z jiného objektu)
  2. jsme líní psát settery a gettery

V určitých případech je to i nutné kvůli nějaké magii, ale to je na trochu jiném levelu

Odpovedať
4.7.2015 0:35
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovedá na Dominik Gavrecký
Ondřej Štorc:4.7.2015 0:38

Čemu na tom nerozumíš když máš například tuhle třídu:

class Clovek {
     public $jmeno;
     private $pohlavi

Tak můžeš udělat tohle:

$ondra = new Clovek();
echo($ondra->jmeno);

ale už nemůžeš udělat tohle:

$ondra = new Clovek();
echo($ondra->pohlavi);
Odpovedať
+2
4.7.2015 0:38
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Odpovedá na Ondřej Štorc
Dominik Gavrecký:4.7.2015 6:33

Dakujem toto mi celkom pomohlo ...

Odpovedať
4.7.2015 6:33
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Bebbana
Člen
Avatar
Bebbana:2.10.2015 1:46

Tak jsem se zasekla :(
Clovek.php :

<?php

    class Clovek
    {

        public $jmeno;
        public $prijmeni;
        public $vek;
        public function pozdrav()
        {
                echo('Ahoj, já jsem ' . $this->jmeno);
        }
    }

a index.php:

!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <?php
        require_once('tridy/Clovek.php');

        $karel = new Clovek();
        $karel->jmeno = 'Karel';
        $karel->prijmeni = 'Novák';
        $karel->vek = 30;
        $karel->pozdrav();
    ?>
    </body>
</html>

A po spuštení mi to vypíše jenom: "Ahoj, já jsem" a nic víc. Přitom mám vše přesně jak v článku, třídu Člověk ve složce tridy a zkoušela jsem to jak na localhostu, tak na endoře, výsledek stejnej. Díky za radu.

 
Odpovedať
2.10.2015 1:46
Avatar
Jakub Novák
Člen
Avatar
Odpovedá na Bebbana
Jakub Novák:2.10.2015 2:12

Tak sem asi posíláš jiný kód, protože tenhle je funkční.

Zkus tohle :

<?php

class Person
{
        /** @var string */
        private $name;

        /** @var string */
        private $surname;

        /** @var string */
        private $age;

        public function sayHello()
        {
                print("Hi, I'm $this->name $this->surname and I'm $this->age years old.");
        }

        public function __set($var, $value)
        {
                $this->$var = $value;
        }

        public function __get($var)
        {
                return $this->$var;
        }
}
?>

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <?php

        $person = new Person();
        $person->name = "Karel";
        $person->surname = "Novák";
        $person->age = 21;
        $person->sayHello();
    ?>
    </body>
</html>

V budoucnu místo 30ti public vars můžeš použít magické metody GET a SET, stejně jako jsem použil já teď (nebude našeptávač). Víc si o tom můžeš přečíst třeba tady http://php.net/…p5.magic.php. Je určitě dobré vědět, že existujou a nenarušovat zapouzdření objektů + můžeš místo magických metod používat vlastní gettery a settery. Co si ale budeme nalhávat, skoro každý programátor používá public vars protože to jsou líný čuníci (včetně mě) a každý řádek navíc je zbytečná ztráta času.

 
Odpovedať
2.10.2015 2:12
Avatar
Odpovedá na Radomír Panna
pradedadedymraze:23.4.2016 1:12

Nic ti to nepíše, protože vytváříš karla a voláš konstruktor bez parametru

$karel = new Clovek();

- tedy vytvoříš objekt karel ale nenastavíš jméno, příjmení ani věk. Musíš to volat takto:

$karel = new Clovek("Arnošt","Pátek",30);
 
Odpovedať
23.4.2016 1:12
Avatar
pradedadedymraze:23.4.2016 1:13

Jinak celkem pěkně se tyhle pokusy ladí třeba zde: http://www.runphponline.com/

 
Odpovedať
23.4.2016 1:13
Avatar
Pavel Parma
Člen
Avatar
Odpovedá na Jakub Novák
Pavel Parma:23.4.2016 2:10

Ohledně těch našeptávačů, PhpStorm povoluje annotace, které pomáhají určit i magicky nastavené proměnné. Je to @property-read @property-write a @property (ta je read i write), annotace následuje datovým typem a pak názvem attributu jako proměnné (např. $foo). Existuje dokonce i annotace pro magicke metody @method. Tady máte kdyžtak seznam používaných annotací, jelikož je to pro php jen nevyužívaný string, vytažitelný reflekcí, záleží na konkrétním IDE, zda je využívá nebo ne.

https://manual.phpdoc.org/…rty.pkg.html

 
Odpovedať
23.4.2016 2:10
Avatar
Adam Černohous:11.1.2017 10:24

Musím vždycky ve třídě definovat její atributy, když mám konstruktor, který se o to postará? Protože to funguje i bez nich.

Např.:

public $firstname; // atributy tridy, funguje to bez nich
public $lastname; // atributy tridy, funguje to bez nich
public $age; // atributy tridy, funguje to bez nich

public function __construct($firstname, $lastname, $age) {
    $this->firstname = $firstname;
    $this->lastname = $lastname;
    $this->age = $age;

    }

Díky moc!

 
Odpovedať
11.1.2017 10:24
Avatar
Pavel Bartoš:24.7.2017 9:17

Ahoj chtěl bych se zeptat, jestli je možné používat v těle třídy funkci, která si bere jako parametr proměnnou, jelikož jsem tu zatím viděl jen případy, kdy se používá některá proměnná z atributů třídy a to napevno až v samotnem těle funkce... A může-li být ta proměnná z přijatá z vnějšku třídy, nebo musí být uvnitř třídy. A jestli musí, tak jestli musí být public, nebo private.

Např:
$cislo=10;
$Pocitacka= new pocitacka();
$pocitacka->pocitej($cislo);

Šlo by to nebo ne?
Díky :-)

 
Odpovedať
24.7.2017 9:17
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 84.