Playing with the new PHP5.4 features


PHP5.4 it’s close and it’s time to start playing with the new cool features. I’ve created a new Virtual Machine to play with the new features available within PHP5.4. I wrote a post with the most exciting features (at least for me) when I saw the feature list in the alpha version. Now the Release Candidate is with us, so it’s the time of start playing with them. I also discover really cool features that I pass over in my first review

Let’s start:

Class member access on instantiation.

Cool!

class Human
{
    function __construct($name)
    {
        $this->name = $name;
    }

    public function hello()
    {
        return "Hi " . $this->name;
    }
}

// old style
$human = new Human("Gonzalo");
echo $human->hello();

// new cool style
echo (new Human("Gonzalo"))->hello();

Short array syntax
Yeah!

$a = [1, 2, 3];
print_r($a);

Support for Class::{expr}() syntax

foreach ([new Human("Gonzalo"), new Human("Peter")] as $human) {
    echo $human->{'hello'}();
}

Indirect method call through array

$f = [new Human("Gonzalo"), 'hello'];
echo $f();

Callable typehint

function hi(callable $f) {
    $f();
}

hi([new Human("Gonzalo"), 'hello']);

Traits

trait FlyMutant {
    public function fly() {
        return 'I can fly!';
    }
}

class Mutant extends Human {
    use FlyMutant;
}

$mutant = new Mutant("Storm");
echo $mutant->fly();

Array dereferencing support

function data() {
    return ['name' => 'Gonzalo', 'surname' => 'Ayuso'];
}

echo data()['name'];

IDEs don’t support (yet) those features. That’s means IDEs will mark those new features as syntax errors but I hope that they will support them soon.
More info here

23 thoughts on “Playing with the new PHP5.4 features

    1. Ohh, didnt see the
      [ ] 🙂

      What would
      function hi(callable $f) { $f(); }

      hi([new Human(), ‘hello’, ‘world’]);
      return?

      1. I’m really excited with the sort syntax of arrays 🙂

        callable typehint allows us to call “callable” things (closures, function names or even indirect method call through array)

        Anyway
        hi([new Human(), ‘hello’, ‘world’]);
        it’s wrong

        array(new Human(), ‘hello’) is a callabel element now (indirect method call through array)

        Maybe you want to do

        function hi(callable $f, $name) { $f($name); }
        hi([new Human(), ‘hello’], ‘world’);

        (I don’t have my VM with PHP5.4 so I cannot check it with a real instalation. I will check it later)

      1. echo new Human(‘foo’)->hello();
        sounds good but it has conflicts with Human (function) and Human (class).

        The only viable solution is (new Human(‘foo’))->hello();

      2. Well you have the
        echo new Human;
        echo new Human()->foo() = class
        echo Human::static = class
        echo Human() = function

        Human()->foobar
        would be a function which returns a class

        function Human() {
        return new Foo();
        }

      3. I understand It can be “ugly” but IMHO is a cool way to avoid write factory methods. Namespace separator also was ugly at the begininig but now I love it.

      1. It would be nice if was a ‘ternary like’ ruby for this situation:
        $name ||= ‘Gonzalo’
        (use $name, case blank , assign Gonzalo to it)

  1. I’m still waiting for these:

    function is_closure($v) {return is_object($v) and is_callable($v);}

    function is_iteratable($v) {return is_array($v) or is_object($v) and !is_callable($v);}

  2. $a = [1, 2, 3];
    print_r($a);

    Its throw Error
    Parse error: syntax error, unexpected ‘[‘ in D:\xampp\htdocs\joseph\worex\thephp\array\arrayDe.php on line 2

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.