2009-10-02 34 views
19

Trong các ngôn ngữ như Java, quá tải có thể được sử dụng theo cách này:Quá tải hàm PHP là gì?

void test($foo, $bar){} 
int test($foo){} 

Sau đó, nếu bạn gọi test() với 2 đối số ví dụ test($x, $y);, chức năng đầu tiên sẽ được gọi. Nếu bạn chỉ vượt qua 1 đối số, ví dụ: test($x);, hàm thứ hai sẽ được gọi.

Từ hướng dẫn có vẻ như php 5 không có quá tải, nhưng nó là gì? Tôi dường như không hiểu hướng dẫn về chủ đề này ..

+0

Xem thêm [Tại sao PHP không hỗ trợ chức năng quá tải?] (http://programmers.stackexchange.com/a/190550/ 84349). –

+0

Bạn có thể sử dụng lớp quá tải trong liên kết này: http://stackoverflow.com/questions/4697705/php-function-overloading/27231803#27231803 –

Trả lời

25

PHP's meaning of overloading khác với Java. Trong PHP, quá tải nghĩa là bạn có thể thêm thành viên đối tượng trong thời gian chạy, bằng cách triển khai some of the __magic methods, như __get, __set, __call, __callStatic. Bạn tải các đối tượng với các thành viên mới.

Quá tải trong PHP cung cấp các phương thức động " động" tạo "và phương pháp. Các thực thể động này được xử lý qua phương thức ma thuật, một phương pháp có thể thiết lập trong một lớp cho các loại hành động khác nhau .

Một ví dụ:

class Foo 
{ 
    public function __call($method, $args) 
    { 
     echo "Called method $method"; 
    } 
} 

$foo = new Foo; 

$foo->bar(); // Called method bar 
$foo->baz(); // Called method baz 

Và bằng cách này, PHP hỗ trợ loại quá tải kể từ PHP 4.3.0. Sự khác biệt duy nhất là trong các phiên bản trước PHP 5, bạn phải kích hoạt rõ ràng quá tải bằng chức năng overload().

+0

Điều gì có thể là bất kỳ lợi thế có thể có của loại quá tải mà ví dụ bạn đã đưa ra? ?? –

+8

Một kịch bản mà trong đó '__call()' tỏ ra rất hữu ích khi tôi xây dựng một lớp chuyển đổi tiền tệ. Thay vì gọi '$ converter-> convert (2, 'EUR', 'USD');' bạn thực sự có thể gọi '$ converter-> convertEurToUsd (2);', điều này dễ đọc hơn nhiều trong quan điểm của tôi. Bạn có thể xem các nguồn của tôi: http://github.com/igstan/php-utils/blob/master/tests/CurrencyConverterTest.php http://github.com/igstan/php-utils/blob/master/ src/CurrencyConverter.php –

+2

Tôi sử dụng phương pháp này cho một giao diện LINQ giống như động cho cơ sở dữ liệu của tôi. Vì vậy, tôi có thể làm những việc như $ db-> Select ('table') -> col_1 [$ value] -> col_2 [$ value] -> Merge ('col_1'); Vì vậy, tất cả các __calls(). Chuyển qua lớp xử lý chính xác (ví dụ: SQL, Tệp, Xml). – null

14

Nếu bạn muốn quá tải một chức năng giống như trong Java, không chỉ định bất kỳ đối số và sử dụng chức năng func_num_argsfunc_get_args để có được số lượng đối số hoặc các đối số mình đã được truyền cho hàm:

function test() { 
    $args = func_get_args(); 
    switch (count($args)) { 
     case 1: 
      // one argument passed 
      break; 
     case 2: 
      // two arguments passed 
      break; 
     default: 
      // illegal numer of arguments 
      break; 
    } 
} 
-1

Để qua tải một chức năng đơn giản là vượt qua tham số như là null theo mặc định,

class ParentClass 
{ 
    function mymethod($arg1 = null, $arg2 = null, $arg3 = null) 
    { 
    if($arg1 == null && $arg2 == null && $arg3 == null){ 
     return 'function has got zero parameters <br />'; 
    } 
    else{ 
     $str = ''; 
     if($arg1 != null) 
     $str .= "arg1 = ".$arg1." <br />"; 

     if($arg2 != null) 
     $str .= "arg2 = ".$arg2." <br />"; 

     if($arg3 != null) 
     $str .= "arg3 = ".$arg3." <br />"; 

     return $str; 
     } 
    } 
} 

// and call it in order given below ... 

$obj = new ParentClass; 

echo '<br />$obj->mymethod()<br />'; 
echo $obj->mymethod(); 

echo '<br />$obj->mymethod(null,"test") <br />'; 
echo $obj->mymethod(null,'test'); 

echo '<br /> $obj->mymethod("test","test","test")<br />'; 
echo $obj->mymethod('test','test','test'); 
Các vấn đề liên quan