Need help with PhpGenerics?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

ircmaxell
420 Stars 10 Forks 14 Commits 5 Opened issues

Description

Here be dragons

Services available

!
?

Need anything else?

Contributors list

# 38,431
PHP
Shell
Symfony
randomi...
3 commits
# 45,972
Symfony
skeleto...
Flask
curl
2 commits
# 87,020
PHP
php-fra...
libreof...
ods
1 commit
# 3,918
PHP
Shell
ast
C
1 commit

Muahahahahahahaha

I'll let the example speak for itself:

Example:

Test/Item.php

namespace test;

class Item {

protected $item;

public function __construct(T $item = null)
{
    $this->item = $item;
}

public function getItem()
{
    return $item;
}

public function setItem(T $item)
{
    $this->item = $item;
}

}

Test/Test.php

namespace Test;

class Test { public function runTest() { $item = new Item; var_dump($item instanceof Item); // true $item->setItem(new StdClass); // works fine // $item->setItem([]); // E_RECOVERABLE_ERROR } }

test.php

require "vendor/autoload.php";

$test = new Test\Test; $test->runTest();

HOW???

Black magic and voodoo.

Where can I use generics?

Right now, only class definitions can define generics, and any parameter or return type declaration can use them.

It also supports parameter-expansion:

class Foo {
    public function bar(): Foo {}
}

As far as the rest, I don't know.

Seriously, How???

Like I said, black magic. If you want to know, you're going to regret it.

How do I install?

Since this is black voodoo evilness, I'm not adding it to packagist. Simply add a composer repository pointing here, and composer install. Then just use generics in your code and be happy.

HOW ARE YOU DOING THIS?

You really don't want to know...

Gotchas

Right now, generic types are not resolved according to use rules. So

    new Item

Always points to

\StdClass
. It will not respect
use
or the present namespace. This is a TODO.

FOR THE LOVE OF GOD, HOW???

Fine. Your loss.

I hijack the composer autoloader, and substitute my own. I then pre-process all autoloaded files, transpiling them to eliminate generics from declarations. I also compile usages from generic syntax to namespace syntax (compiling the types as we go along).

So:

php
new Item
Becomes
php
new Item\①StdClass①
Then, the autoloader recognizes attempts to load these classes and will generate the templated code... The above 2 blocks of code will be compiled to:
php
class test
{
    public function runTests()
    {
        $item = new \test\Item\①StdClass①(new \StdClass());
        $itemList = new \test\ItemList\①StdClass①();
        $itemList->addItem($item);
    }
}
And: ```php namespace test\Item;

class ①StdClass① extends \test\Item { protected $item;

public function __construct(\StdClass $item)
{
    $this->item = $item;
}

public function getItem() { return $item; }

public function setItem(\StdClass $item) { $this->item = $item; }

} ```

TL;DR

TL;DR: don't use this

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.