Access class Konstante und statische Methode von string
Ich habe einen string, der den Namen der Klasse und ich möchte auch eine Konstante, und rufen Sie eine (statische) Methode, die von dieser Klasse.
<?php
$myclass = 'b'; //My class I wish to use
$x = new x($myclass); //Create an instance of x
$response = $x->runMethod(); //Call "runMethod" which calls my desired method
//This is my class I use to access the other classes
class x {
private $myclass = NULL;
public function __construct ( $myclass ) {
if(is_string($myclass)) {
//Assuming the input has a valid class name
$this->myclass = $myclass;
}
}
public function runMethod() {
//Get the selected constant here
print $this->myclass::CONSTANT;
//Call the selected method here
return $this->myclass::method('input string');
}
}
//These are my class(es) I want to access
abstract class a {
const CONSTANT = 'this is my constant';
public static function method ( $str ) {
return $str;
}
}
class b extends a {
const CONSTANT = 'this is my new constant';
public static function method ( $str ) {
return 'this is my method, and this is my string: '. $str;
}
}
?>
Als ich erwartet hatte (mehr oder weniger), mit $variable::CONSTANT
oder $variable::method();
funktioniert nicht.
Bevor Sie Fragen, was ich versucht habe; ich habe versucht, so viele Dinge, die ich im Grunde vergessen.
Was ist der beste Ansatz, um dies zu tun? Vielen Dank im Voraus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zugriff auf die Konstanten, verwenden Sie
- Konstante()
:Beraten: Wenn Sie arbeiten mit namespaces, die Sie benötigen, um speziell fügen Sie den namespace an, um die Zeichenfolge selbst, wenn Sie anrufen
constant()
aus dem gleichen Namensraum!Für den Anruf, du wirst
call_user_func()
:Jedoch: das ist alles nicht sehr effizient, so möchten Sie vielleicht zu einem anderen Blick auf Ihr Objekt-Hierarchie design. Gibt es vielleicht einen besseren Weg, um das gewünschte Ergebnis erzielen, mit Vererbung etc.
self::CONSTANT
?constant()
, aber ich bin mit PHP-seit vielen Jahren...Verwenden
call_user_func
Aufruf statische Methode:in php 7 Sie können diesen code verwenden,
Können Sie erreichen es, indem Sie eine temporäre variable. Nicht der eleganteste Weg aber es funktioniert.
Ich denke, es ist zu tun mit der Doppeldeutigkeit des
::
, zumindest, was die Fehlermeldung ist in Anspielung auf (PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM
)Definierten Klassen als abstract kann nicht instanziiert werden, und jede Klasse enthält mindestens eine abstrakte Methode darf auch Abstrakt sein. Definierten Methoden als abstract deklarieren Sie einfach die Methode ist, die Unterschrift - Sie können nicht definieren die Umsetzung.
Beim Erben von einer abstrakten Klasse alle Methoden markiert abstract in der übergeordneten Klasse Erklärung muss definiert werden, durch das Kind; zusätzlich müssen diese Methoden mit der selben (oder einer weniger eingeschränkten) Sicht. Zum Beispiel, wenn die abstrakte Methode als protected definiert, die Implementierung der Funktion muss definiert werden, entweder als protected oder public, aber nicht privat. Außerdem werden die Signaturen der Methoden müssen übereinstimmen, d.h. die type-hints und die Anzahl der erforderlichen Argumente müssen die gleichen sein werden. Dies gilt auch für Konstruktoren in PHP 5.4. Vor 5.4 Konstruktor-Signaturen abweichen können.
Finden Sie http://php.net/manual/en/language.oop5.abstract.php