📜  如何在PHP模拟多个构造函数?

📅  最后修改于: 2022-05-13 01:57:40.442000             🧑  作者: Mango

如何在PHP模拟多个构造函数?

构造函数是特殊的成员函数,用于对类中新创建的对象实例进行初始设置。

在PHP,构造函数是一个名为__construct()的方法,它在创建对象后由关键字new调用。构造函数也可以接受参数,在这种情况下,在编写 new 语句时,您还需要为参数发送构造函数参数。

构造函数是定义未来对象及其性质的非常基本的构建块。您可以说构造函数是对象创建的蓝图,为成员函数和成员变量提供值。

构造函数类型:

  • 默认构造函数:它没有参数,但可以动态传递给默认构造函数的值。
  • 参数化构造函数:它接受参数,您也可以将不同的值传递给数据成员。
  • 复制构造函数:它接受其他对象的地址作为参数。

注意:与Java等语言不同, PHP支持为类声明不同数量参数的多个构造函数。



多个构造函数:一个类中有多个用于初始化实例的构造函数。

示例 1:在下面的示例中,我们创建一个脚本并尝试声明多个构造函数。我们将使用一个构造函数分配学生姓名,并使用另一个构造函数分配年龄

PHP


PHP
";
    }
      
    public function ConstructorWithArgument2($arg1, $arg2) {
        echo('Constructor with 2 parameters called: 
            '.$arg1.','.$arg2)."
";     }            public function ConstructorWithArgument3($arg1, $arg2, $arg3) {         echo('Constructor with 3 parameters called:          '.$arg1.','.$arg2.','.$arg3)."
";     }     public function __construct() {         $arguments = func_get_args();         $numberOfArguments = func_num_args();            if (method_exists($this, $function =                  'ConstructorWithArgument'.$numberOfArguments)) {             call_user_func_array(                         array($this, $function), $arguments);         }     } }    // Constructor with 1 parameter $obj = new Student('Akshit');     // Constructor with 2 parameters $obj = new Student('Akshit','Nikita');     // Constructor with 3 parameters  $obj = new Student('Akshit','Nikita','Ritesh');     ?>


PHP
id=$idOrName;
            echo "ID is initialized using constructor"."
";             // other members are still uninitialized         }         else {             $this->name = $idOrName;             echo "Name is initialized using constructor"."
";         }     }           public function setID($id) {         $this->id = $id;     }           public function setName($name) {         $this->name = $name;     }           public function getinfo() {         echo "ID : ". $this->id."
";         echo "Name : ". $this->name."
";     } }     // Create instance $student = new Student("Akshit"); $student->setID(1); $student->getinfo();     $student2 = new Student(2); $student2->setName("Nikita"); $student2->getinfo();    ?>


输出:

PHP Fatal error:
Cannot redeclare Student::__construct() in 
/home/33a7c36527d199adf721ab261035d4f7.php on line 10

我们必须使用不同的方法在PHP使用多个构造函数。下面列出了一些。

方法:

  • 通过使用PHP func_get_arg()从作为参数传递的参数中获取提到的值来获取所有分配的参数。
  • 我们将首先使用PHP func_num_args()计算传递给构造函数的参数数量
  • 通过使用PHP gettype()或数据类型特定函数(如 is_int())了解参数类型。
  • 根据参数数量命名您的方法,并使用PHP method_exists()检查它的存在。
  • 通过将原始参数作为call_user_func_array()的第二个参数传递,使用call_user_func_array()调用合适的函数。

示例 2:

PHP

";
    }
      
    public function ConstructorWithArgument2($arg1, $arg2) {
        echo('Constructor with 2 parameters called: 
            '.$arg1.','.$arg2)."
";     }            public function ConstructorWithArgument3($arg1, $arg2, $arg3) {         echo('Constructor with 3 parameters called:          '.$arg1.','.$arg2.','.$arg3)."
";     }     public function __construct() {         $arguments = func_get_args();         $numberOfArguments = func_num_args();            if (method_exists($this, $function =                  'ConstructorWithArgument'.$numberOfArguments)) {             call_user_func_array(                         array($this, $function), $arguments);         }     } }    // Constructor with 1 parameter $obj = new Student('Akshit');     // Constructor with 2 parameters $obj = new Student('Akshit','Nikita');     // Constructor with 3 parameters  $obj = new Student('Akshit','Nikita','Ritesh');     ?>
输出
Constructor with 1 parameter called: Akshit
Constructor with 2 parameters called: Akshit,Nikita
Constructor with 3 parameters called: Akshit,Nikita,Ritesh

方法:

  • 检查构造函数传递的参数类型。可以使用gettype()来完成 或特定于数据类型的函数,如is_int()
  • 确定类型并初始化实例变量。

示例 3:以下示例演示了具有不同数据类型(如字符串或整数)的多个构造函数。

PHP

id=$idOrName;
            echo "ID is initialized using constructor"."
";             // other members are still uninitialized         }         else {             $this->name = $idOrName;             echo "Name is initialized using constructor"."
";         }     }           public function setID($id) {         $this->id = $id;     }           public function setName($name) {         $this->name = $name;     }           public function getinfo() {         echo "ID : ". $this->id."
";         echo "Name : ". $this->name."
";     } }     // Create instance $student = new Student("Akshit"); $student->setID(1); $student->getinfo();     $student2 = new Student(2); $student2->setName("Nikita"); $student2->getinfo();    ?>
输出
Name is initialized using constructor
ID : 1
Name : Akshit
ID is initialized using constructor
ID : 2
Name : Nikita