Autor Zpráva
SeparateSK
Profil
Dobrý deň, potreboval by som vedieť ako vytvoriť class v classe - pre lepšie triedenie.
Mám tento kód:
<?php
class JLSocial{
        public static function VymazFoto($id){
            //Script na vymazanie fotografie z databázy a zo servera
            echo 'Funguje!';
        }                
    }
?>
Teda na použite VymazFoto stačí:
JLSocial::VymazFoto(...);
Samozrejme potrebujem to nejak kategorizovať, lebo funkcií VymazFoto budem potrebovať viac, jednu pre statusy a druhú pre galériu.
Teda by som potreboval niečo ako:
JLSocial::Galeria::VymazFoto(...);
Tak som to skúsil:
<?php
class JLSocial{
    class Galeria{
        public static function VymazFoto($id){
            //Script na vymazanie fotografie z databázy a zo servera
            echo 'Funguje! FotoID: '.$id;
        }    
    }
}
JLSocial::Galeria::VymazFoto(2);
?>
No, a vyhodila sa chyba
Parse error: syntax error, unexpected T_CLASS, expecting T_FUNCTION in C:\wamp\www\globchat\cc.php on line 3

Vedel by mi niekto pomôcť?
DJ Miky
Profil
Vnořovat třídy nelze, místo toho můžeš použít jmenné prostory.
Tori
Profil
SeparateSK:
V obou kontextech (status, galerie) se ty metody mají chovat identicky, anebo jde spíš o stejné rozhraní (jehož implementace se v různých kontextech může měnit)? Čím se od sebe ty kontexty liší - nemohly by mít společného abstraktního předka (např. AbstractGraphicComponent) + interface? Koukněte kdyžtak i na traits.
SeparateSK
Profil
No , nelíšia sa až tak veľmi. Viem mohol by som tie funkcie zlúčiť ,tak ,že by som pridal ešte jeden argument, ktorý určí typ.
<?php
class JLSocial{
        public static function VymazFoto($id,$type){
            //Script na vymazanie fotografie z databázy a zo servera
            if($type=="galeria")echo "Galeria";
           elseif($type=="status")echo "Status";
        }                
    }
?>
JLSocial::VymazFoto(2,"galeria");
Ale tú triedu v triede by som potreboval iba kôli lepšej prehladnosti.
Ugo
Profil
SeparateSK:
DJ Miky nabídl namespace, to je přesně to co hledáš, jedinej problém je složitější syntaxe ale hlavně funkčnost až od 5.3 :(
SeparateSK
Profil
No práve to :( Ja mám PHP 5.2.6
A keď som tento kód : http://sk.php.net/manual/en/language.namespaces.rationale.php
skúšal teraz na nejakom freehostingu ktorý podporuje php 5.3+, tak jediný výsledok bol 500 Internal Server Error
Ugo
Profil
SeparateSK:
aha tak to upřímnou soustrast, taky sem nucen držet u všeho kompatibilitu s 5.2 ... tak prefixy, tak to "řeší" zend - neni nic hezčího než Application_Social_JLS_Photos_Gallery :p vlastně je to totožný, jen se nedaj nějaký ty části v kontextu vynechat takže ten zdroják je pak asi luxusní ;)
SeparateSK
Profil
No ,tak som to robil doteraz :D
Teda: JLSocial_Galeria_VymazFotku($id);
Alebo určením typu akcie: JLSocial_VymazFotku($id,$typ);
Tori
Profil
SeparateSK:
Pořád mi nejsou jasné dvě věci:
1. jaký vztah je mezi objekty JLSocial a [Status nebo Galerie]? (jestli se nedá použít kompozice, JLSocial::get('galerie')->vymazFotku($id))
2. jestli objekty Status a Galerie mají něco společného nebo ne? (např. jestli můžou mít společného abstraktního předka)
(ale možná jsem jen nepochopila, čeho vlastně chcete dosáhnout.)
SeparateSK
Profil
O tej kompozícií som nikdy nepočul, ale skúsil som to a je to presne to čo hľadám a funguje to v PHP 5.2.6, takže ďakujem :) .
Tu je kód:
<?php
class Galeria{
    function Galeria(){
        echo "Galéria initializovaná!<br>";
    }
    function PridajKomentar($fID,$aID,$komentar){
        echo "Komentár pridaný ku fotke $fID, autorove ID: $aID:<br>&nbsp;<i>$komentar</i><br>";
    }
}
class Status{
    function Status(){
        echo "Statusy initializované!<br>";
    }
    function PridajKomentar($sID,$aID,$komentar){
        echo "Komentár pridaný ku statusu $sID, autorove ID: $aID:<br>&nbsp;<i>$komentar</i><br>";
    }
}
class JLSocial{
    var $Galeria;
    var $Status;
    function JLSocial(){
        echo "JLSocial initializované!<br>";
        $this->Galeria=new Galeria();
        $this->Status=new Status();
    }
}
$JLSocial=new JLSocial;
$JLSocial->Galeria->PridajKomentar(1,1,"Ahoj!");
$JLSocial->Status->PridajKomentar(1,1,"Vitaj!");
?>

1. JLSocial je jadro ,pod ktoré by mali spadať objekty Galeria a Status.
2. Obe patria pod jadro socialnej siete ,ktorú tvorím. Rozdiel medzi Status a Galerie , je vo vykonávaní funkcie na danom mieste v DB a na serveri.
JLSocial::Galeria::VymazFoto($id) - vymaže fotografiu s ID $id zo servera a z databázy
JLSocial::Status::VymazFoto($id) - vymaže fotografiu zo všetkých statusov ktoré boli kedy pridané.
Lepšie by to asi popísala funkcia: PridajKomentár :) ,pri ktorej to je už jasné.

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: