Skip to the content...

Welcome to the David Walsh Blog. I'm a MooTools, Dojo, jQuery, CSS, and PHP Web Developer located in Madison, Wisconsin, United States. Please contact me if I can make your experience on my website better.

Method Chaining in MooTools and PHP

11 Responses »

One of the great parts of most every JavaScript and PHP framework these days is the ability to chain class methods. I've gotten quite a few question about how this is possible so I want to cover the basics of allowing chaining in your own custom classes.

Lets first start by implementing some new methods on the MooTools Element class:

/* implement functionality */
Element.implement({
	doTaskA: function() {
		/* do stuff */
	},
	doTaskB: function() {
		/* do stuff */
	}
});

What the above methods actually do really isn't very important per this post. Now that you have these methods in place, you try the following:

/* Example */
$('myElement').doTaskA().doTaskB();

Good? Nope. You'll end up with the following error:

$('myElement').doTaskA() is undefined

What? doTaskA() definitely exists!! Why is this error occuring? While doTaskA() does exist, the method doesn't return anything.

The strategy for method chaining is returning a reference to the current object. How? Lets update the doTaskA() and doTaskB() methods to allow for method chaining:

Element.implement({
	doTaskA: function() {
		/* do stuff */
		return this;
	},
	doTaskB: function() {
		/* do stuff */
		return this;
	}
});

Returning this keeps the reference which in turn keeps the ability to chain alive. You can do the same thing in PHP:

public function doTaskA() {
	return $this;
}

public function doTaskB() {
	return $this;
}

/* usage */
$myObject->doTaskA()->doTaskB();

Class method chaining is a great way to keep your code condensed. Don't get too carried away with chaining though -- be sure to balance chaining with readability.

Discussion

  1. June 3, 2009 @ 8:56 am

    I had no idea you could chain methods like that in PHP. I was trying to think of a way to do exactly that just last night, and couldn’t figure it out. Champion!

  2. June 3, 2009 @ 11:28 am

    I’m affraid that it’s not possible to do method chaining natively in PHP. I’m used to use this synthax in most PHP frameworks and I didn’t knows that wasn’t a native feature ! I have learn something :)

  3. June 3, 2009 @ 11:53 am

    i’ve been searching this tips for a long time now :) i think i’ll have to recode some of my classes :)

    thanx for the tips (again)

  4. June 4, 2009 @ 7:57 am

    It’s one of the best tips I’ve ever read! Thanks!

  5. jem
    June 4, 2009 @ 4:11 pm

    Took me a while to get in the habit of always returning some object in functions or class methods.

    Also don’t forget about the chain method that a lot of native mootools classes support, i use it a fair bit when working with FX.

    var myTween = new Fx.Tween($(‘someElement’), {property: ‘opacity’}).set(0).start(1).chain(functioin() { /* do something when tween completes */})

  6. June 4, 2009 @ 10:54 pm

    Cool stuff. I recently wrote two php classes Rules and Access. The rules class has basic validation methods like isSunday() isAdmin() etc. each do a boolean check setting a class param and returns $this. The the Access class is realy just a namespace for static methods like isAdminAndSunday() that simply returns the result from RulesInstance->isSunday()->isAdmin()->get();

    Very decent stuff once you figure out usage for it

  7. June 5, 2009 @ 2:54 am

    Thtas a clever little tip there, thanks!

  8. chris the developer
    June 9, 2009 @ 6:11 am

    AFAIK, method chaining is only available in PHP 5.

  9. July 13, 2009 @ 6:16 pm

    Very nice articles. all are really useful :)

Be Heard!

Share your thoughts with fellow developers of all skill levels! I want to hear from you!

Name*:
Email*:
Website:  
Wrap your code with <code> tags, f00!