Thông thường bạn không thể nhưng tôi nghĩ có rất nhiều cách để chuyển đối số đã đặt tên cho hàm PHP. Cá nhân tôi chuyển tiếp vào định nghĩa sử dụng mảng và chỉ cần gọi những gì tôi cần phải vượt qua:
class Test{
public $a = false;
private $b = false;
public $c = false;
public $d = false;
public $e = false;
public function _factory(){
$args = func_get_args();
$args = $args[0];
$this->a = array_key_exists("a",$args) ? $args["a"] : 0;
$this->b = array_key_exists("b",$args) ? $args["b"] : 0;
$this->c = array_key_exists("c",$args) ? $args["c"] : 0;
$this->d = array_key_exists("d",$args) ? $args["d"] : 0;
$this->e = array_key_exists("e",$args) ? $args["e"] : 0;
}
public function show(){
var_dump($this);
}
}
$test = new Test();
$args["c"]=999;
$test->_factory($args);
$test->show();
dụ sống ở đây: http://sandbox.onlinephpfunctions.com/code/d7f27c6e504737482d396cbd6cdf1cc118e8c1ff
Nếu tôi phải vượt qua 10 đối số, và 3 trong số đó là các dữ liệu tôi thực sự cần, thậm chí không SMART để vượt qua thành chức năng giống như
return myfunction(false,false,10,false,false,"date",false,false,false,"desc");
với cách tiếp cận tôi đưa ra, bạn có thể thiết lập bất kỳ của 10 đối số vào một mảng:
$arr['count']=10;
$arr['type']="date";
$arr['order']="desc";
return myfunction($arr);
Tôi có một bài đăng trong blog của mình giải thích quy trình này để biết thêm chi tiết.
http://www.tbogard.com/2013/03/07/passing-named-arguments-to-a-function-in-php
Trên thực tế trong mẫu mã của bạn, các '$ c = "thanh"' được gán 'bar' đến một '$ c' trong * phạm vi người gọi * (không có trong các chức năng được gọi là' foo') và sau đó chuyển giá trị được gán cho 'foo()' làm tham số thứ hai, tham số này sẽ được nhận dưới dạng biến '$ b' cục bộ. – Petruza