Tại sao PHP không hỗ trợ quá tải chức năng?


37

Tôi tự hỏi nếu một trong những tính năng chính của ngôn ngữ lập trình là có khả năng quá tải các chức năng thông qua các đối số. Tôi nghĩ rằng đó là điều cần thiết trong bối cảnh của lập trình hướng đối tượng.

Có phải nó cố tình để lại và không được phép? Hoặc là quá tải không phải là một thực hành tốt?


27
Quá tải chức năng không thực sự là một tính năng của lập trình OO. Chức năng của lớp phụ vượt quá mục đích của đa hình thường được coi là một tính năng cần thiết của OO - nhưng không phải là quá tải chức năng dựa trên các đối số. Python cũng không có chức năng nạp chồng dựa trên đối số. Dù sao, quá tải chức năng có lẽ thực tế hơn trong các ngôn ngữ gõ tĩnh nơi liên kết hàm xảy ra tại thời điểm biên dịch và dựa trên loại của từng tham số chức năng.
Charles Salvia

2
@CharlesSalvia Đó sẽ là một câu trả lời hay.
kiamlaluno

1
Những gì ông nói. Ngoài ra, quá tải chức năng được đánh giá cao. Bạn không phải sử dụng cùng tên hàm cho các chức năng khác nhau; chỉ cung cấp tên hàm của bạn tương tự nhưng không giống nhau. Mặt khác, người vận hành quá tải ...
Mr Lister

Mặc dù không phải là câu trả lời cho câu hỏi cụ thể, tôi sẽ đăng liên kết này giúp tôi hiểu rõ hơn CÁCH sử dụng quá tải trong PHP. hy vọng nó giúp
DiegoDD

Câu trả lời:


33

Ai bảo bạn PHP không hỗ trợ quá tải chức năng? !!!

Trên thực tế PHP không hỗ trợ chức năng nạp chồng, nhưng theo một cách khác. Các tính năng nạp chồng của PHP khác với Java:

Giải thích "quá tải" của PHP khác với hầu hết các ngôn ngữ hướng đối tượng. Quá tải theo truyền thống cung cấp khả năng có nhiều phương thức có cùng tên nhưng số lượng và loại đối số khác nhau.

Kiểm tra các khối mã sau đây.

Hàm tìm tổng của n số:

function findSum() {
    $sum = 0;
    foreach (func_get_args() as $arg) {
        $sum += $arg;
    }
    return $sum;
}

echo findSum(1, 2), '<br />'; //outputs 3
echo findSum(10, 2, 100), '<br />'; //outputs 112
echo findSum(10, 22, 0.5, 0.75, 12.50), '<br />'; //outputs 45.75

Chức năng thêm hai số hoặc nối hai chuỗi:

function add() {
    //cross check for exactly two parameters passed
    //while calling this function
    if (func_num_args() != 2) {
        trigger_error('Expecting two arguments', E_USER_ERROR);
    }

    //getting two arguments
    $args = func_get_args();
    $arg1 = $args[0];
    $arg2 = $args[1];

    //check whether they are integers
    if (is_int($arg1) && is_int($arg2)) {
        //return sum of two numbers
        return $arg1 + $arg2;
    }

    //check whether they are strings
    if (is_string($arg1) && is_string($arg2)) {
        //return concatenated string
        return $arg1 . ' ' . $arg2;
    }

    trigger_error('Incorrect parameters passed', E_USER_ERROR);
}

echo add(10, 15), '<br />'; //outputs 25
echo add("Hello", "World"), '<br />'; //outputs Hello World

Phương pháp tiếp cận hướng đối tượng bao gồm quá tải phương thức:

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

Tham chiếu: http://php.net/manual/en/lingu.oop5.overloading.php

Trong PHP, quá tải phương tiện bạn có thể thêm các thành viên đối tượng ở thời gian chạy, bằng cách thực hiện một số phương pháp kỳ diệu như __set, __get, __call, vv

class Foo {

    public function __call($method, $args) {

        if ($method === 'findSum') {
            echo 'Sum is calculated to ' . $this->_getSum($args);
        } else {
            echo "Called method $method";
        }
    }

    private function _getSum($args) {
        $sum = 0;
        foreach ($args as $arg) {
            $sum += $arg;
        }
        return $sum;
    }

}

$foo = new Foo;
$foo->bar1(); // Called method bar1
$foo->bar2(); // Called method bar2
$foo->findSum(10, 50, 30); //Sum is calculated to 90
$foo->findSum(10.75, 101); //Sum is calculated to 111.75

29
Bit thứ hai về cái mà PHP gọi là "quá tải" không giống nhau. Nó chỉ là PHP sử dụng một tên được thiết lập tốt cho một cái gì đó chủ yếu khác nhau, xem xét nó là PHP, mặc dù điều đó không đáng ngạc nhiên.
phant0m

10
Đó không phải là chức năng quá tải. Để thực sự quá tải một hàm, bây giờ hãy viết tương đương php findSum(10, "steve", { 86, "2012-09-20" });. Một quá tải thực sự sẽ cho phép các tham số mới của các loại khác nhau.
Joel Etherton

3
@JoelEtherton - Cách giải thích "quá tải" của PHP khác với hầu hết các ngôn ngữ hướng đối tượng. Quá tải theo truyền thống cung cấp khả năng có nhiều phương thức có cùng tên nhưng số lượng và loại đối số khác nhau. ref: http://php.net/manual/en/lingu.oop5.overloading.php Quá tải trong PHP cung cấp phương tiện để tự động "tạo" các thuộc tính và phương thức. Những thực thể động này được xử lý thông qua các phương thức ma thuật mà người ta có thể thiết lập trong một lớp cho các loại hành động khác nhau.
rajukoyilandy

7
@rajukoyilandy: Đó là tất cả tốt và tốt, nhưng câu hỏi của OP hỏi tại sao PHP không thực hiện quá tải "truyền thống". Câu trả lời của bạn không giải quyết điều đó.
Joel Etherton

7
Đây không phải là quá tải. Vẫn chỉ có một định nghĩa / khai báo của hàm. Điều này sẽ tương đương với va_list / va_arg trong C ++. Bạn có thể giải quyết một số vấn đề tương tự? Vâng. Nhưng nó vẫn không quá tải.
Lu-ca

13

Không phải là hỗ trợ đầy đủ "Quá tải truyền thống", chỉ một phần .

ĐỊNH NGH : A : "Quá tải truyền thống" cung cấp, khi gọi phương thức, khả năng có nhiều phương thức có cùng tên nhưng số lượng và loại đối số khác nhau. Đối với khai báo phương thức , nó cung cấp tùy chọn để thể hiện một khai báo riêng / tách riêng cho từng hàm bị quá tải.

Lưu ý: phần thứ hai của định nghĩa này thường được liên kết với các ngôn ngữ lập trình được nhập tĩnh , thực hiện kiểm tra kiểu và / hoặc kiểm tra arity , để chọn khai báo chính xác. PHP không phải là một ngôn ngữ gõ tĩnh, nó là động và sử dụng gõ yếu .


HPORT TRỢ PHP :

  • CÓ, cung cấp khả năng gọi nhiều phương thức có cùng tên nhưng số lượng khác nhau . Xem câu trả lời của func_get_args và @rajukoyilandy, chúng ta có thể sử dụng f(x)f(x,y).

  • CÓ, cung cấp khả năng gọi nhiều phương thức có cùng tên nhưng các loại khác nhau . Se sử dụng nội bộ của gettype trong phương pháp.

    • NHƯNG cho các tham chiếu ... Chỉ các biến có thể được chuyển qua tham chiếu, bạn không thể quản lý quá tải để phát hiện hằng / biến.
  • KHÔNG cung cấp khả năng khai báo nhiều phương thức có cùng tên nhưng số lượng khác nhau . Điều này là do chúng ta có thể gọi f(x)f(x,y)với cùng một ftuyên bố.

  • KHÔNG cung cấp khả năng khai báo nhiều phương thức có cùng tên nhưng các loại khác nhau . Điều này là do trình biên dịch PHP phải diễn giải f($integer,$string) giống như chức năng đó f($string,$integer).

Xem thêm tài liệu nạp chồng PHP5 để biết các giải thích "quá tải phi truyền thống".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.