anael
anael

Reputation: 17

php: Instantiate class on-the-fly

Is it possible to instantiate a class from a string, without declaring another variable before ?

It's usually done writing

$className = 'myClass'
$instance  = new $className();

but it could be handy to have it shorter like for example

$instance  = new ${'className'}();

The purpose is to have objects created (under condition) inside a loop without use of extra vars...

Edit : $className is dynamic, it is hard coded above to explain the situation

Upvotes: 0

Views: 1349

Answers (3)

kodeart
kodeart

Reputation: 1903

See factory pattern.

class Foo {
    static function factory($class, array $args = null) {
        return new $class($args);
    }
}

// class factoring; returns a new instance of requested class ($className)
Foo::factory($className);

I added optional arguments array if you want to set some class properties.

// pass some values for class constructor
Foo::factory($className, array('arg1' => 1, 'arg2' => 2, 'args3' => 3));

Furthermore, you can build "fluid" interfaces so you can "chain" methods when you use that pattern:

Foo::factory($className)->method1()->method2(array('param' => 'value'))->etc();

where method1(), method2() must return $this (the object itself) to chain multiple method calls in one line.

Upvotes: 2

Alex Howansky
Alex Howansky

Reputation: 53563

You could make a factory function (or class/method) that takes a class name as a parameter, and then call it with the result of your dynamic PHP code that generates the string. You might consider it a bit cleaner but it's not going to save you any memory or speed.

class foo { }
function factory($class) { return new $class(); }

foreach (...) {
    $instance = factory(<some code that returns the string 'foo'>);
}

Upvotes: 1

noj
noj

Reputation: 6759

It's one extra variable, does it really make much of a difference? The answer is that unless you use eval (which comes with security issues) it isn't possible to do it any shorter than your first example.

Upvotes: 1

Related Questions