Method Chaining i PHP – metodkedjor

I och med PHP 5+ och stödet för objekt finns det något som kallas Method Chaining. Detta innebär att du kan köra flera funktioner/metoder efter varandra.

Ett ganska vanligt förekommande sätt att använda objekt på är följande.

$userObj = new User();
$userObj->setUsername('baronen');
$userObj->setEmail('mail@mail.com');
$userObj->RegisterUser();

Här skapar vi ett nytt User objekt, sedan anropar vi två set-funktioner för att sedan köra funktionen RegisterUser.

Använd Method Chaining

Man behöver inte göra stora ändringar för att skapa metodkedjor. Jag har här skapat en väldigt enkelt User-klass som har två set funktioner och en funktion för att skriva ut egenskaperna.

class User
{
    private $username;
    private $email;
	
    public function setEmail($email) {
        $this->email = $email;
	return $this;
    }
    public function setUsername($username) {
        $this->username = $username;
	return $this;
    }
    public function RegisterUser() {
	echo "Register user with email " . $this->email . "";
	echo " and username " . $this->username . "";
    }
}

Den ända skillnaden från en “vanlig” klass är att set-funktionerna returnerar hela objektet, detta för att kunna bygga på med fler funktioner på följande sätt.

$userObj = new User();
$userObj->setEmail('baronen@mail.org')->setUsername('baronen')->RegisterUser();

Resultatet blir i detta fall följande:
Register user with email baronen@mail.org and username baronen

Svårare än så är det inte att använda sig av “Method Chaining”.

Resultat

Se demo eller Ladda ner källkod här.

8 Replies to “Method Chaining i PHP – metodkedjor”

  1. Det är ju smidigt att baka in t.ex. 2 rader kod till 1 och samma.
    Har du kollat nåt på om eller hur mycket snabbare method chaining är än på vanliga viset?

    Om man har väldigt, väldigt många set-metoder som måste anropas så kan det lätt bli en rätt lång kod-rad. Men skulle vara intressant att veta skillnaden i hastigheten mellan dem!

    1. Jag har faktiskt inte kollat om det är snabbare eller långsammare.

      Man behöver inte heller skriva allt på en rad utan det skulle även kunna gå att skriva på följande sätt.
      $userObj = new User();
      $userObj->setEmail(‘baronen@mail.org’)
      ->setUsername(‘baronen’)
      ->setFirstname(‘Andreas’)
      ->RegisterUser();

  2. Jag kodar för det mesta .net så jag har inte så stor koll på php. Men har man verkligen inte kunnat gjort detta tidigare? Det låter vansinnigt. Det handlar ju bara om att returnera objektet. Det är iofs långt ifrån god programmeringsmetodik att göra dessa typer av kedjor och jag förstår inte vad vinsten är.

    1. PHP hade inte jättebra objektstöd i PHP 4- och därför tror jag inte man kunde returnera objekt.

      Har du lust att utveckla varför det inte är god etik att använda kedjor enligt följande:
      $userObj = new User();
      $userObj->setEmail(?baronen@mail.org?)
      ->setUsername(?baronen?)
      ->setFirstname(?Andreas?);

      Jag vet att Zend kör så i sitt ramverk, skulle vara intressant att veta varför du anser att det inte är bra.

  3. Kim: att anropa en set-metod är långt från samma sak som att anropa en get-metod. Eftersom Andreas i kodexemplet enbart skickar in data i en klass för att spara ner det så har han ju ingen nytta av att få något returnerat.

    Det är ju stor skillnad på:
    $userObj = new User();
    $userObj->setEmail(?baronen@mail.org?)
    ->setUsername(?baronen?)
    ->setFirstname(?Andreas?);

    och:
    $userObj = new User();
    $userObj->getEmail(?baronen@mail.org?)
    ->getUsername(?baronen?)
    ->getFirstname(?Andreas?);

    1. För det första kan man göra detta i de flesta moderna språk men trots detta använder man inte kedjor där. Det finns inte incitament till det och det strukturen och läsbarheten försvinner.

      Och ja. Jag vet att det är skillnad på getters och setters… herregud… Det är bland annat därför jag tycker det är fel. Bara själva ideén om att returnerar objekt från en set-funktion är ju bara fel fel fel. 🙂 Det tycker alla fall jag

  4. Detta med method chaining stötte jag på första gången nu när jag började att jobba med Zend Framework. Så jag har inte stött på det innan, men jag måste säga att jag gillar det skarpt. Snabbt och enkelt skulle jag vilja beskriva det.

Din kommentar eller åsikt