2017-03-15 22 views
0

我有一個參數數組傳遞給參數個數可變的方法。我完全不知道該怎麼做。嘗試在函數上調用參數數組

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

您傳遞給'_call'方法的第一個參數始終是'$ this-> realObject'的屬性? 'realObject'是你在Entity構造函數中注入的類實例嗎? – amenadiel

+0

是的,這是其他人的課程的抽象。我的對象是它們對象的副本。 – Badger

回答

1

built-in support for this in PHP >= 5.6(你應該至少運行)。

例如爲:

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

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

iAcceptManyParameters(...$parameters); 

你可以看到它的工作here

+0

完美,謝謝。只需添加三個點就可以解決問題,誰會想到! – Badger

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 {...}。然後,您的課程將繼承其公共和受保護的屬性&方法。

0

好的,你會發現,當你試圖執行你沒有訪問權限的類的方法時,會調用一個類的魔法__call。所以,在這種情況下:

​​

現在,讓我們說,你比如這個類,並嘗試調用一個私有方法

$myEntity = new Entity(); 

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

受保護的方法調用由__call截獲,所以它就像你曾打電話

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

無論你決定在__call方法中做什麼,這取決於你。在我的示例中,它只是將您的調用轉發給受保護的方法。

相關問題