Bạn không thể làm những gì bạn đang yêu cầu; nhưng bạn có thể "lừa gạt", bằng cách sử dụng thực tế rằng, trong PHP, bạn có thể có một hàm có cùng tên với một lớp; những cái tên đó sẽ không xung đột.
Vì vậy, nếu bạn khai báo một lớp học như thế này:
class Test {
public function __construct($param) {
$this->_var = $param;
}
public function myMethod() {
return $this->_var * 2;
}
protected $_var;
}
Sau đó bạn có thể khai báo một hàm trả về một thể hiện của lớp đó - và có chính xác cùng tên với lớp:
function Test($param) {
return new Test($param);
}
Và bây giờ, nó trở nên có thể sử dụng một lớp lót, giống như bạn hỏi - chỉ điều là bạn đang gọi chức năng, do đó không sử dụng mới:
$a = Test(10)->myMethod();
var_dump($a);
Và nó hoạt động: ở đây, tôi nhận được:
int 20
như đầu ra.
Và, tốt hơn, bạn có thể đặt một số PHPDoc trên chức năng của bạn:
/**
* @return Test
*/
function Test($param) {
return new Test($param);
}
Bằng cách này, bạn thậm chí sẽ có gợi ý trong IDE của bạn - ít nhất, với Eclipse PDT 2.x; thấy Screeshot:
http://extern.pascal-martin.fr/so/class-and-function.png
Sửa 2010-11-30: Chỉ cần cung cấp thông tin, một RFC mới đã được gửi đi, một vài ngày trước, rằng đề xuất thêm tính năng này cho một trong các phiên bản tương lai của PHP.
Xem: Request for Comments: Instance and method call/property access
Vì vậy, có thể làm những việc như thế này sẽ có thể trong PHP 5.4 hoặc phiên bản khác trong tương lai:
(new foo())->bar()
(new $foo())->bar
(new $bar->y)->x
(new foo)[0]
btw, nếu bạn không sử dụng 5.4 (bạn có thể không), bạn có thể xác định hàm trợ giúp chỉ trả về đối tượng cho chuỗi ... chức năng với ($ obj) {return $ obj; } (chọn các trick lên từ laravel: P) .. sau đó bạn có thể làm với (new Obj) -> method() – kapv89
Đơn giản như '(new Object()) -> doSomething()'. –