我傻眼了。我一直在寻找关于类构造函数(特别是在PHP中)的确切定义。
据我了解,这是该类在调用时执行的初始函数,是否正确?
是否我们专门调用函数本身?
有人能在这里说清楚吗?或者至少指出我正确的方向。
答案 0 :(得分:4)
PHP允许开发人员为类声明构造函数方法。具有构造函数方法的类在每个新创建的对象上调用此方法,因此它适用于对象在使用之前可能需要的任何初始化。
构造函数通过初始化所有实例变量并在内存中创建一个位置来保存Object来创建它所在类的Object。
例如,您可能想要初始化 基于10或20的整数变量 在某种情况下,当你的 类已创建。在这种情况下你 不能硬编码值 变量声明。这样的 代码可以放在里面 构造函数使初始化 会在课堂上发生 实例化。
首次调用PHP类时,该类将自动运行类构造函数,这可以帮助自动配置类。如果您需要在使用类方法之前预设一些实例变量,会话或cookie,这将非常有用。
的好读答案 1 :(得分:2)
你或多或少是正确的 - 它是一个在实例化类时调用的函数(使用new
关键字创建)。
除非扩展类并覆盖构造函数,否则不必专门调用它,因为除非使用__construct()
明确定义,否则子类parent::__construct()
不会调用它的父构造函数。
E.g。
class A {
public $value;
function __construct() {
$this->value = "A";
}
}
$a = new A();
echo $a->value; // "A";
class B extends A {
}
$b = new B();
echo $b->value; // "A";
class C extends A {
function __construct() {
$this->value = "C";
}
}
$c = new C();
echo $c->value; // "C";
class D extends A {
function __construct() {
$this->value = "D";
parent::__construct();
}
}
$d = new D();
echo $d->value; // "D";
答案 2 :(得分:0)
当您创建类的新实例时会调用它,该实例会自动调用,您可以在那里启动任何局部变量。要在释放/销毁对象之前完成必须完成的工作,可以使用析构函数。构造函数和析构函数不是PHP特定的,但对于OO编程语言是通用的。 见this
答案 3 :(得分:0)
只要创建了类的新实例(即对象),就会调用构造函数。这允许您设置对象的状态,以及传入对象可能需要正常工作的任何依赖项,例如CacheManager或数据库连接,或者......
如果你有一个继承链,即C类扩展了扩展了A类的B类,那么请记住如果你在链的下方某处覆盖构造函数,则显式调用父构造函数:
<?php
class C extends B
{
public function __construct ($constructorParams)
{
parent::__construct($constructorParams);
}
}
构造函数不应返回值。
答案 4 :(得分:0)
据我了解,这是类在调用时执行的初始函数,是正确的吗?
这是首次创建类的新实例时调用的方法。它是一个实例方法,因为它只适用于实例。 (一个对象是一个实例;一个类是 对象所属的东西。方法可以属于类,而不是实例。 PHP调用这些静态方法,但这并不总是其他语言使用的术语。)
在某些语言中,构造函数实际返回新对象。在PHP中不是这种情况,其中构造函数用于初始化目的。
是否我们专门调用函数本身会被调用?
正确。当您使用new
运算符时调用它。
class Foo {
public function __construct() { echo "I foo'd.\n" ;}
}
$f = new Foo(); // Echos "I foo'd.\n"
你可能想要read over the PHP manual sections about classes and objects。
答案 5 :(得分:0)
没有。 没有。 是。
只有在创建对象时才会调用构造函数。当你以后只在某处使用你的对象时,它不会被调用。
创建新对象时,构造函数是一个被调用的方法,它初始化对象的变量/字段。
构造函数必须与其所在的类具有相同的名称。
答案 6 :(得分:0)
是。来自维基百科 -
在PHP(版本5及更高版本)中,构造函数是一个名为__construct()的方法,关键字new在创建对象后自动调用。它通常用于自动执行各种初始化,例如属性初始化。构造函数也可以接受参数,在这种情况下,在编写新语句时,还需要在括号之间向构造函数发送函数参数。
答案 7 :(得分:-1)
#include<iostream>
using namespace std;
class shape{
protected:
int w, h, a;
public:
shape(int, int);
};
shape :: shape(int x, int y){
w = x;
h = y;
};
class triangle : public shape{
public:
void disp_area();
};
void triangle :: disp_area(){
a = (w + h) * 1 / 2;
cout<<endl<<" Area Of Triangle : "<<a;
};
class rectangle : public shape{
public:
void disp_area();
};
void rectangle :: disp_area(){
a = w * h;
cout<<endl<<" Area Of Rectangle : "<<a;
};
int main(){
triangle obj1;
rectangle obj2;
obj1.shape(2, 3);
obj2.shape(4, 5);
obj1.disp_area();
obj2.disp_area();
return 0;
};