Why can't I overload constructors in PHP?

后端 未结 14 902
长情又很酷
长情又很酷 2020-12-04 11:30

I have abandoned all hope of ever being able to overload my constructors in PHP, so what I\'d really like to know is why.

Is there even a reason for it? Doe

相关标签:
14条回答
  • 2020-12-04 11:42

    I think we can also use constructor with default arguments as a potential substitute to constructor overloading in PHP.

    Still, it is really sad that true constructor overloading is not supported in PHP.

    0 讨论(0)
  • 2020-12-04 11:45

    You can of course overload any function in PHP using __call() and __callStatic() magic methods. It is a little bit tricky, but the implementation can do exactly what your are looking for. Here is the resource on the official PHP.net website:

    https://www.php.net/manual/en/language.oop5.overloading.php#object.call

    And here is the example which works for both static and non-static methods:

    class MethodTest
    {
        public function __call($name, $arguments)
        {
            // Note: value of $name is case sensitive.
            echo "Calling object method '$name' "
                 . implode(', ', $arguments). "\n";
        }
    
        /**  As of PHP 5.3.0  */
        public static function __callStatic($name, $arguments)
        {
            // Note: value of $name is case sensitive.
            echo "Calling static method '$name' "
                 . implode(', ', $arguments). "\n";
        }
    }
    
    $obj = new MethodTest;
    $obj->runTest('in object context');
    
    MethodTest::runTest('in static context');  // As of PHP 5.3.0
    
    

    And you can apply this to constructors by using the following code in the __construct():

    $clsName = get_class($this);
    $clsName->methodName($args);
    

    Pretty easy. And you may want to implement __clone() to make a clone copy of the class with the method that you called without having the function that you called in every instance...

    0 讨论(0)
  • 2020-12-04 11:52

    For completeness, I'll suggest Fluent Interfaces. The idea is that by adding return $this; to the end of your methods you can chain calls together. So instead of

    $car1 = new Car('blue', 'RWD');
    $car2 = new Car('Ford', '300hp');
    

    (which simply wouldn't work), you can do:

    $car = (new Car)
           ->setColor('blue')
           ->setMake('Ford')
           ->setDrive('FWD');
    

    That way you can pick exactly which properties you want to set. In a lot of ways it's similar to passing in an array of options to your initial call:

    $car = new Car(['make' => 'Ford', 'seats' => 5]);
    
    0 讨论(0)
  • 2020-12-04 11:53
    <?php
    
        class myClass {
    
            public $param1 = 'a';
            public $param2 = 'b';
    
            public function __construct($param1 = NULL, $param2 = NULL) {
    
                if ($param1 == NULL && $param2 == NULL) {
    //                $this->param1 = $param1;
    //                $this->param2 = $param2;
                } elseif ($param1 == NULL && $param2 !== NULL) {
    //                $this->param1 = $param1;
                    $this->param2 = $param2;
                } elseif ($param1 !== NULL && $param2 == NULL) {
                    $this->param1 = $param1;
    //                $this->param2 = $param2;                
                } else {
                    $this->param1 = $param1;
                    $this->param2 = $param2;
                }
    
            }
    
        }
    
    //    $myObject  = new myClass();
    //    $myObject  = new myClass(NULL, 2);
        $myObject  = new myClass(1, '');
    //    $myObject  = new myClass(1, 2);
    
        echo $myObject->param1;
        echo "<br />";
        echo $myObject->param2;
    
    ?>
    
    0 讨论(0)
  • 2020-12-04 11:53

    Adding this answer for completeness with respect to current PHP , since later versions of PHP , you can in fact overload constructors in a way . Following code will help to understand ,

    <?php
    class A
    {
        function __construct()
        {
            $a = func_get_args();
            $i = func_num_args();
            if (method_exists($this,$f='__construct'.$i)) {
                call_user_func_array(array($this,$f),$a);
            }
        }
       
        function __construct1($a1)
        {
            echo('__construct with 1 param called: '.$a1.PHP_EOL);
        }
       
        function __construct2($a1,$a2)
        {
            echo('__construct with 2 params called: '.$a1.','.$a2.PHP_EOL);
        }
       
        function __construct3($a1,$a2,$a3)
        {
            echo('__construct with 3 params called: '.$a1.','.$a2.','.$a3.PHP_EOL);
        }
    }
    $o = new A('sheep');
    $o = new A('sheep','cat');
    $o = new A('sheep','cat','dog');
    ?>
    

    Output :

    __construct with 1 param called: sheep
    __construct with 2 params called: sheep,cat
    __construct with 3 params called: sheep,cat,dog
    
    0 讨论(0)
  • 2020-12-04 11:55

    You can use variable arguments to produce the same effect. Without strong typing, it doesn't make much sense to add, given default arguments and all of the other "work arounds."

    0 讨论(0)
提交回复
热议问题