Autor Zpráva
Someone
Profil
Dobrý den, v PHP programuji již nějakou dobu a tak jsem se rozhodl nahlédnout i do světa objektů. Něco málo zvládám, avšak stále se mi nedaří nalézt, jakým způsobem docílit něčeho takového:

<?php
    
    $o = new mojeTrida(); // moje třída obsahuje funkci split, které vrátí explode druhého parametru, kde delimetr je parametr první
    $text = "Hello world!";
    print_r($o->split(" ",$text));
    
    //Já bych rád dosáhl něčeho takového
    $text = "Hello world!";
    print_r($text->split(" ")); (jako je tomu např. v JS)
    
?>

Jak můžu něčeho takového dosáhnout? Předem děkuji za každou radu.
Majkl578
Profil
V PHP nelze.
Someone
Profil
:( děkuji za info.
juriad
Profil
Podle mě to není možné (tady narážíš na rozdíl mezi prototypy - JS a třídami - php)
nemůžeš tedy volat metody na typu string, ale nad svými objekty můžeš; musíš nějak ten string změnit (obalit), například jak uvádíš v prvním případu, nebo:
    $o = new mojeTrida("Hello world!"); // moje třída obsahuje funkci split, které vrátí explode, kde delimetr je jediný parametr
    print_r($o->split(" "));
ale toto už asi umíš
Tori
Profil
Someone:
To byste musel mít nějakou třídu String, která bude obsahovat funkce pro práci s řetězci, což by ve většině případů byly jen wrappery pro nativní funkce jazyka. Aspoň kdyby se u nich vždycky předával řetězec jako první parametr, tak by to šlo relativně jednoduše přes __call, ale bohužel.
Someone
Profil
Je možné, že by to vypadlo nějak takto?

class mojeTrida {

    private $string;

    public function __construct($str) {
        $this->string = $str;
    }

    public function split($del) {
    
        return explode($del,$this->string);

    }

}
juriad
Profil
Someone:
nevidím v tom chybu, ale spíš se zamysli nad tím, jestli by to nebylo lepší opačně:
class Splitter {
    private $delimiter;
 
    public function __construct($delimiter) {
        $this->delimiter = $delimiter;
    }
 
    public function split($text) {
        return explode($this->delimiter, $text);
    }
}
použití:
$podle_mezer = new Splitter(' ');
$podle_mezer->split('Hello world!');
$podle_mezer->split('Na okně seděla kočka byl horký letní den');

nepotřebuješ většinou rozdělit jeden text podle více delimiterů, ale stejným způsobem rozdělit více textů
Someone
Profil
juriad:
S tím splitem to byl jen příklad, třída mojeTrida bude mít více funkcí, které se budou používat. Tudíš mi přijde nevýhodné dělat kvůli každé funkci (split atd..) vytvářet novou instanci.

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: