如何在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