2013-06-26 44 views
5

Có quá tải phương thức hỗ trợ php không. Trong khi thử dưới mã nó cho thấy nó hỗ trợ quá tải phương thức. Bất kỳ chế độ xem nàoPhương thức hỗ trợ Php có quá tải

class test 
{ 
    public test($data1) 
    { 
    echo $data1; 
    } 
} 

class test1 extends test 
{ 
    public test($data1,$data2) 
    { 
     echo $data1.' '.$data2; 
    } 
} 

$obj = new test1(); 
$obj->test('hello','world'); 

Vì tôi đã quá tải phương thức cho đầu ra là "hello world". Đoạn mã trên cho thấy php hỗ trợ quá tải phương thức. Vì vậy, câu hỏi của tôi là quá tải phương thức hỗ trợ php.

+0

Kiểm tra câu trả lời này http://stackoverflow.com/a/4697712/387194, trong trường hợp của bạn, bạn không sử dụng quá tải nhưng ghi đè. Chức năng cũ không được thực thi nếu bạn viết '$ obj-> test ('hello');' – jcubic

+0

Tham khảo: http://stackoverflow.com/questions/4697705/php-function-overloading – Arvind

Trả lời

10

Bạn nên tạo sự khác biệt giữa method overriding (ví dụ của bạn) và method overloading

Đây là một ví dụ đơn giản như thế nào để thực hiện phương pháp quá tải trong PHP sử dụng __call magic method:

class test{ 
    public function __call($name, $arguments) 
    { 
     if ($name === 'test'){ 
      if(count($arguments) === 1){ 
       return $this->test1($arguments[0]); 
      } 
      if(count($arguments) === 2){ 
       return $this->test2($arguments[0], $arguments[1]); 
      } 
     } 
    } 

    private function test1($data1) 
    { 
     echo $data1; 
    } 

    private function test2($data1,$data2) 
    { 
     echo $data1.' '.$data2; 
    } 
} 

$test = new test(); 
$test->test('one argument'); //echoes "one argument" 
$test->test('two','arguments'); //echoes "two arguments" 
+0

Làm cách nào để tạo một trong số chúng được bảo vệ và công chúng khác? Có vẻ như nếu __call cần phải được công khai, loại mở rộng cửa? Trường hợp sử dụng, getter công cộng, setter được bảo vệ đều có cùng tên với thuộc tính data ... hoặc bạn có thể phải mổ xẻ thông tin người gọi (có thể có một chút tiết) – nus

+0

Cho dù tôi có thể có nhiều chức năng gọi ở đây? – Shan

+0

Vui lòng phát triển ý của bạn bằng * nhiều chức năng gọi *. Nếu nằm ngoài phạm vi của câu hỏi này, vui lòng đăng câu hỏi đó dưới dạng câu hỏi mới. Tôi chắc chắn bạn sẽ nhận được câu trả lời chính xác. – skafandri

1

Vì vậy, câu hỏi của tôi là phương thức hỗ trợ quá tải php (?).

Có, nhưng không theo cách đó, và trong ví dụ của bạn, nó không cho thấy loại quá tải này là chính xác, ít nhất với phiên bản 5.5.3 của nó và error_reporting(E_ALL).

Trong phiên bản này, khi bạn cố gắng chạy mã này, nó cung cấp cho bạn thông báo sau:

Strict Standards: Declaration of test1::test() should be compatible 
with test::test($data1) in /opt/lampp/htdocs/teste/index.php on line 16 

Warning: Missing argument 1 for test::test(), called in /opt/lampp/htdocs/teste/index.php 
on line 18 and defined in /opt/lampp/htdocs/teste/index.php on line 4 

Notice: Undefined variable: data1 in /opt/lampp/htdocs/teste/index.php on line 6 
hello world //it works, but the messages above suggests that it's wrong. 
0

Bạn quên thêm 'chức năng' trước khi thử nghiệm trong cả hai trường hợp. Phương thức được gọi là lớp con bởi vì khi bạn gọi phương thức từ đối tượng lớp con, trước tiên nó kiểm tra xem phương thức đó có tồn tại trong lớp con không, nếu không thì nó sẽ nhìn vào lớp cha kế thừa với chế độ hiển thị công khai hoặc được bảo vệ và nếu phương thức tồn tại hơn trả về kết quả theo đó.

Các vấn đề liên quan