Method overloading leads to call first defined one if number of arguments does not match #13

Closed
opened 2018-07-21 15:14:21 +02:00 by belliash · 3 comments
Owner

Aer Information

  • Aer Version (or commit ref): d1b874b391
  • Operating System: Linux
  • System Architecture (eg. arm, x86_64, ...): x86_64

Your problem description

PH7 takes first method defined, if it does not match the arguments list.
This shows well below example, which defines 3 methods with the same name. Each of them takes different number of arguments.

<?php
    class Test {
        function a() {
            echo 'I take 0 arguments' . PHP_EOL;
        }
        function a($a) {
            echo 'I take 1 argument' . PHP_EOL;
        }
        function a($a, $b) {
            echo 'I take 2 arguments' . PHP_EOL;
        }
    };
    $t = new Test();
    $t->a();
    $t->a(1);
    $t->a(1, 2);
    $t->a(1, 2, 3);
?>

Should we treat this as a bug or as a feature?

Expected results

As PH7 does not emit any errors, expected output is:
I take 0 arguments
I take 1 argument
I take 2 arguments

Current results

Actual result is:
I take 0 arguments
I take 1 argument
I take 2 arguments
I take 0 arguments

<!-- 1. Please speak English, this is the language all of us can speak and write. 2. Please take a moment to check that your issue doesn't already exist. 3. Please give all relevant information below for bug reports, because incomplete details will be handled as an invalid report. --> # Aer Information - Aer Version (or commit ref): d1b874b391 - Operating System: Linux - System Architecture (eg. arm, x86_64, ...): x86_64 # Your problem description PH7 takes first method defined, if it does not match the arguments list. This shows well below example, which defines 3 methods with the same name. Each of them takes different number of arguments. <?php class Test { function a() { echo 'I take 0 arguments' . PHP_EOL; } function a($a) { echo 'I take 1 argument' . PHP_EOL; } function a($a, $b) { echo 'I take 2 arguments' . PHP_EOL; } }; $t = new Test(); $t->a(); $t->a(1); $t->a(1, 2); $t->a(1, 2, 3); ?> Should we treat this as a bug or as a feature? # Expected results As PH7 does not emit any errors, expected output is: I take 0 arguments I take 1 argument I take 2 arguments # Current results Actual result is: I take 0 arguments I take 1 argument I take 2 arguments I take 0 arguments
Member

This behaviour might lead to subtle bugs I think.

This behaviour might lead to subtle bugs I think.
Owner

In PHP this has twice behaviors because PHP does not support method overloading.

  1. If method takes one or more arguments and we simply call a(), it ends with fatal error (too few arguments passed).

  2. If we pass more arguments to the function than it takes, there is no error, and additional, unnecessary arguments are skipped.

I see two solutions:

  1. We strictly match number of arguments and if there are too less, or too much of them end with error, or NOOP as method is not matched.

  2. We copy PHP's behavior.

There is one more thing - variadic functions but I do not know if we support them? At least in 1.0?

In PHP this has twice behaviors because PHP does not support method overloading. 1. If method takes one or more arguments and we simply call a(), it ends with fatal error (too few arguments passed). 2. If we pass more arguments to the function than it takes, there is no error, and additional, unnecessary arguments are skipped. I see two solutions: 1. We strictly match number of arguments and if there are too less, or too much of them end with error, or NOOP as method is not matched. 2. We copy PHP's behavior. There is one more thing - variadic functions but I do not know if we support them? At least in 1.0?
Author
Owner

I added variadic functions to the ideas for future releases. There are already a lot of things to do and I think we can skip this feature for now. I think P# should strictly match number of arguments for now, doesnt it?

I added variadic functions to the ideas for future releases. There are already a lot of things to do and I think we can skip this feature for now. I think P# should strictly match number of arguments for now, doesnt it?
belliash added the
bug
label 2018-07-21 18:37:17 +02:00
belliash self-assigned this 2018-07-22 19:08:59 +02:00
belliash self-assigned this 2018-07-28 19:22:06 +02:00
Sign in to join this conversation.
No Milestone
No Assignees
3 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: aerscript/Aer#13
No description provided.