Autor Zpráva
IdemeNaHavaj
Profil
Ahoj

<?php
    class jozo {
        function test(){
            echo "ja som jozo";
        }
    }

    class clovek extends jozo { //cez extends som dostal obsah classu "jozo" do classu "clovek"
        function vypisatTest(){
            test(); //prečo sa nevypíše "ja som jozo"?
        }
    }

    $c = new clovek();
    echo $c->vypisatTest();
?>

Fatal error: Uncaught Error: Call to undefined function test() in /............./class_test.php:11 Stack trace: #0 /............/class_test.php(16): clovek->vypisatTest() #1 {main} thrown in /...................../class_test.php on line 11

Čo teda znamená to extends ked to nepridáva funkcie z jedného classu do druhého?

Edit
Druhá vec čo ma zaujíma je: čítal som článok o classoch a píšu tam že "global" povolí aby bolo niečo vidiež "zvonka". Citujem: Public před názvem atributu označuje, že je atribut viditelný zvenčí. Čo to znamená? Ako zvonku? Možno preto to nefunguje?
Keeehi
Profil
class clovek extends jozo {
        function vypisatTest(){
            $this->test();
        }
    }
IdemeNaHavaj
Profil
Dakujem a čo znamená to public? Skúšal som zavolať funkciu "zvonka" classu a nereaguje:

<?php
    class jozo {
        public function test(){
            echo "ja som jozo";
        }
    }

    class clovek extends jozo { 
        function vypisatTest(){
            $this->test(); 
        }
    }

    $c = new clovek();
    echo $c->vypisatTest();

    test(); //funkcia zavolaná zvonka? má nastavené public, vypisuje že nieje defined: Fatal error: Uncaught Error: Call to undefined function test() 
?>
pcmanik
Profil
IdemeNaHavaj:
Ty nevoláš funkciu, ale metódu. A keď chceš zavolať metódu triedy tak to zapíšeš ako:
(new jozo)->test();

Inak je zvykom aby názvy tried začínali veľkým písmenom.
Keeehi
Profil
případně můžeš volat i
$c->test();
Zechy
Profil
IdemeNaHavaj:
Když je funkce public, znamená to, že když ze třídy vytvoříš instanci, můžeš tu funkci zavolat (třeba právě $c->vypisatText()). Pokud má funkce protected nebo private, můžeš ji volat pouze uvnitř té třídy. Protected se ještě liší tím, že ji můžou volat potomci, private nevidí ani potomek.
IdemeNaHavaj
Profil
Takže je uplne jedno či napíšem pred funkciu public alebo nie, tak či tak sa to zapíše ako
echo $c->vypisatTest(); //tuto nieje public
$c->test(); //tuto je public
?

Zechy:
pomotek myslíš to extends? Teda v tomto priklade "jozo"?

Pokud má funkce protected nebo private, můžeš ji volat pouze uvnitř té třídy.
V mojom príklade ale nemá funkcia vypisatTest() ani protected, ani private, a nemôžem ju volať mimo triedy. Vypíše mi to undefined Call to undefined function vypisatTest(

...
    class clovek extends jozo { 
        function vypisatTest(){ // nema ani protected ani private
            $this->test(); 
        }
    }

    $c = new clovek();
    vypisatTest(); //zavolane mimo triedy
...
    
Zechy
Profil
IdemeNaHavaj:
Proč ji teď voláš jako normální funkci? V předchozím příspěvku si to měl správně, nebo viz můj. Pokud bys té funkci dal private nebo protected, tak právě tak, jak si to měl předtím ji zavolat nemůžeš.

Jinak extends říká, že class je potomkem extends a tím pádem je clovek potomkem jozo, né naopak.
Keeehi
Profil
IdemeNaHavaj:
Takže je uplne jedno či napíšem pred funkciu public alebo nie
Ano. Public je defaultní hodnota. Pokud nenapíšeš nic, tak se to bere, jako kdyby tam bylo public. Vzhledem k přehlednosti je doporučené tam to public psát.

pomotek myslíš to extends? Teda v tomto priklade "jozo"?
Třída člověk je potomkem třídy jozo.

V mojom príklade ale nemá funkcia vypisatTest() ani protected, ani private, a nemôžem ju volať mimo triedy.
Můžeš, ale pořád to neumíš. Volá se takto
$c = new clovek();
$c->vypisatTest(); //zavolane mimo triedy

Nenech se zmást slovem function. Ona to totiž není funkce, tak jak ji znáš, ale metoda. A metody jsou vázané pouze na své třídy. Proto je nemůžeš volat globálně, tak jak se o to snažíš, ale jen na nějakém objektu.
Příklad, proč to nejde globálně:
class Foo {
    public function test() {
        echo "Foo";
    }
}

class Bar {
    public function test() {
        echo "Bar";
    }
}

test();
Metoda test je definovaná jak v třídě Foo, tak v třídě Bar. Jak by mohlo PHP vědět, která metoda se má provést?
Ono je to mnohem složitější, to proč to nejde. Souvisí to taky s vnitřním stavem objektů atp. Ale pro ilustraci to snad stačí.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0