2017-03-15 2 views
0

aufzurufen Ich habe ein Array von Argumenten an eine Methode übergeben, wo die Anzahl der Argumente variabel ist. Ich habe absolut keine Ahnung, wie es geht.Versuchen, ein Array von Argumenten auf einer Funktion

class Entity { 
    protected $realObject; 

    public function __call($name, $arguments) { 
     // just call this method on the $property, otherwise redefine the method 
     // error_log("Called $name"); 

     // TODO support variable numbers of arguments 
     $argc = count($arguments); 
     if($argc > 0) { 
      return $this->realObject->$name($arguments[0]); 
     } else { 
      return $this->realObject->$name(); 
     } 
    } 

} 

Ich habe auf allen möglichen Wegen zu suchen, es zu tun, aber kann nicht scheinen, eine Art und Weise des Drehens eines Arrays in eine Variable von Variablen zu erarbeiten.

+0

und der erste Parameter, den Sie an die '_call' Methode übergeben, ist immer eine Eigenschaft von' $ this-> realObject'? Ist 'realObject' eine Klasseninstanz, die Sie in den Konstruktor von Entity injizieren? – amenadiel

+0

Ja, es ist eine Abstraktion von jemand anderem Klassen. Mein Objekt ist eine Kopie ihres Objekts. – Badger

Antwort

1

Es gibt built-in support for this in PHP >= 5.6 (die Sie mindestens ausführen sollten).

Z. B .:

$parameters = ['parameter1', 'parameter2', 'parameter3']; 

function iAcceptManyParameters(...$parameters) { 
    foreach ($parameters as $parameter) { 
     echo $parameter, "\n"; 
    } 
} 

iAcceptManyParameters(...$parameters); 

Sie können es sehen here arbeiten.

+0

Perfekt, danke. Nur drei Punkte hinzuzufügen hat es gelöst, wer hätte das gedacht! – Badger

0

Wollen Sie das tun?

class Entity 
{ 
    protected $myClass; 

    public function __construct(string $myClass) 
    { 
     $this->myClass = new $myClass; 
    } 

    public function __call($name, $arguments) 
    { 
     return $this->myClass->$name($arguments); 
    } 
} 

class TestClass 
{ 
    public function foo($msg) 
    { 
     return $msg; 
    } 
} 

$entity = new Entity('TestClass'); 
var_dump($entity->foo('bar', 'baz')); 
die(); 

Ausgang:

array(2) { 
    [0]=> 
    string(3) "bar" 
    [1]=> 
    string(3) "baz" 
} 

Aber basierend auf Ihren Kommentar: Yes, it's an abstraction of somebody else's classes. My object is a copy of their object, warum Sie nicht nur Ihre Klasse erstellen, die ihre Klasse erweitert? z.B. class MyEntity extends TheirEntity {...}. Ihre Klasse erbt dann ihre öffentlichen und geschützten Eigenschaften & Methoden.

0

Ok, Sie sehen, magische Methode __call einer Klasse wird aufgerufen, wenn Sie versuchen, eine Methode der Klasse auszuführen, auf die Sie keinen Zugriff haben. Also, in diesem Fall:

class Entity { 

    protected function realObject($a, $b, $c) { 

    } 

    public function __call($name, $arguments) { 

     $argc = count($arguments); 

     if($argc > 0) { 
      return $this->$name($arguments[0],$arguments[1],$arguments[2]); 
     } else { 
      return $this->$name(); 
     } 
    } 

} 
Jetzt

, sagen wir, Sie diese Klasse Instanz und versuchen, eine private Methode

$myEntity = new Entity(); 

$myEntity->realObject('hello','my','friends'); 

Die geschützte Methode aufrufen Aufruf von __call abgefangen wird, so ist es, wie Sie genannt hatte

$myEntity->__call('realObject',['hello','my','friends']); 

Was auch immer Sie sich entscheiden, in Ihrer __call Methode zu tun, ist, dass bei Ihnen. In meinem Beispiel leitet es Ihren Aufruf einfach an die geschützte Methode weiter.

Verwandte Themen