我有一个参数数组传递给一个参数数量可变的方法。我完全不知道怎么做。
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();
}
}
}
我一直在研究各种各样的方法,但似乎找不到将数组转换为变量变量的方法。
答案 0 :(得分:1)
有built-in support for this in PHP >= 5.6(你应该至少运行它)。
E.g:
$parameters = ['parameter1', 'parameter2', 'parameter3'];
function iAcceptManyParameters(...$parameters) {
foreach ($parameters as $parameter) {
echo $parameter, "\n";
}
}
iAcceptManyParameters(...$parameters);
您可以看到它正常工作here。
答案 1 :(得分:0)
这是你想要做的吗?
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();
输出:
array(2) {
[0]=>
string(3) "bar"
[1]=>
string(3) "baz"
}
但根据您的评论Yes, it's an abstraction of somebody else's classes. My object is a copy of their object
,为什么不创建您的课程,这会扩展他们的课程?例如class MyEntity extends TheirEntity {...}
。然后,您的班级将继承其公共和受保护的属性。方法
答案 2 :(得分:0)
好的,你知道,当你尝试执行你无法访问的所述类的方法时,会调用类的魔术方法__call
。所以,在这种情况下:
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();
}
}
}
现在,假设您在此类中实例并尝试调用私有方法
$myEntity = new Entity();
$myEntity->realObject('hello','my','friends');
受保护的方法调用被__call
拦截,所以就像你调用了
$myEntity->__call('realObject',['hello','my','friends']);
无论您决定在__call
方法中做什么,都取决于您。在我的示例中,它只是将您的调用转发给受保护的方法。