Kann PHP ein Objekt aus dem Namen der Klasse als Zeichenfolge instanziieren?

80

Ist es in PHP möglich, ein Objekt aus dem Namen einer Klasse zu instanziieren, wenn der Klassenname in einer Zeichenfolge gespeichert ist?

user135295
quelle

Antworten:

132

Ja, auf jeden Fall.

$className = 'MyClass';
$object = new $className; 
Brianreavis
quelle
7
Cool, ich hätte das testen sollen, bevor ich hehe gefragt habe. Vielen Dank!
user135295
2
@user - zu richtig. Ich frage mich, warum ich direkt zu SO gekommen bin, anstatt das Nötigste zu tun. lol
Ben
2
In der Tat ist es nicht so offensichtlich. Ich weiß, dass es in Java eine Sache ist, die Reflexion genannt wird, aber das ist im Vergleich dazu sehr einfach.
Bartis Áron
4
Wenn sich clsss im Namespace befindet, verwenden Sie diese $ class = 'PrintData \\'. $ class; return new $ class ();
Darius.V
2
Wie im PHP-Dokument angegeben, müssen Sie den FQN (Fully Qualified Name) angeben, wenn sich die zu instanziierende Klasse in einem Namespace befindet. Zum Beispiel befand ich mich selbst in einem Namespace von "App \ Http \ Controllers" und hatte eine Zeichenfolge $ string = 'App \ Models \ Task'; Ich dachte, wenn ich versuchen würde, die Zeichenfolge zu instanziieren, würde sie brechen, aber tatsächlich müssen Sie am Anfang kein \ anhängen.
Matt Kieran
6

Ja, das ist es :

<?php

$type = 'cc';
$obj = new $type; // outputs "hi!"

class cc {
    function __construct() {
        echo 'hi!';
    }
}

?>
Herr smith
quelle
4

Wenn Ihre Klasse Argumente benötigt , sollten Sie Folgendes tun:

class Foo 
{
   public function __construct($bar)
   {
      echo $bar; 
   }
}

$name = 'Foo';
$args = 'bar';
$ref = new ReflectionClass($name);
$obj = $ref->newInstanceArgs(array($args));
Josef
quelle
3

Auch statisch:

$class = 'foo';
return $class::getId();
Andrew Atkinson
quelle
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klarstellung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag. - Von der Überprüfung
Blackbam
@Blackbam relevante verwandte ergänzende Antwort. Bitte kommentieren Sie nur, wenn es nützlich ist.
Andrew Atkinson
Richtig, es funktioniert im Grunde trotzdem. Eine kleine Erklärung Ihrer Antwort wäre nett. Die Frage war "Kann PHP ein Objekt instanziieren", aber der Zugriff auf eine statische Elementfunktion ist kein Objektzugriff.
Blackbam
0

Sie können einen dynamischen Aufruf durchführen, indem Sie Ihre Klassennamen / Methoden in einem Speicher wie einer Datenbank speichern. Angenommen, die Klasse ist widerstandsfähig gegen Fehler.

sample table my_table
    classNameCol |  methodNameCol | dynamic_sql
    class1 | method1 |  'select * tablex where .... '
    class1 | method2  |  'select * complex_query where .... '
    class2 | method1  |  empty use default implementation

etc .. Dann in Ihrem Code unter Verwendung der von der Datenbank zurückgegebenen Zeichenfolgen für Klassen- und Methodennamen. Sie können sogar SQL-Abfragen für Ihre Klassen speichern, wobei der Automatisierungsgrad Ihren Vorstellungen entspricht.

$myRecordSet  = $wpdb->get_results('select * from my my_table')

if ($myRecordSet) {
 foreach ($myRecordSet   as $currentRecord) {
   $obj =  new $currentRecord->classNameCol;
   $obj->sql_txt = $currentRecord->dynamic_sql;
   $obj->{currentRecord->methodNameCol}();
}
}

Ich verwende diese Methode, um REST-Webdienste zu erstellen.

Hugo R.
quelle
1
Und wenn es mir gelingt, Ihrer Datenbank eine beliebige Anzahl von Klassen und Methoden hinzuzufügen, habe ich Ihre gesamte Rest-API besessen ... Ein dickes Lob! Bitte benutzen Sie diesen Code NICHT, er ist sehr gefährlich!
James Kipling