开发者学堂课程【PHP 进阶教程-由浅入深掌握面向对象开发-第一阶段:构造方法】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/711/detail/12663
构造方法
内容介绍:
一、构造方法
一、构造方法
1、目标
了解魔术方法的概念,掌握构造方法的作用,明确构造方法的触发模式,构造方法是魔术方法。
类定义的时候一般不初始化,想要初始化得到对象之后进行赋值,更便捷的方法构造方法。
2、概念
构造方法:__construct(),是一种类结构特有的特殊方法,该方法由系统规定好,开发人员在定义的时候只需要抄一遍,有了构造方法的类在实例化对象之后,对象就会自动调用。
(1)构造方法是一种魔术方法:魔术方法是会自动被触发,不需要手动调用的方法。(比如家里面进账都必须放到保险柜里,这是一条规定,拿着钱回家之后第一件事情是把钱放到保险柜,因为不能违反规定。魔术方法就是专门做这种规定。魔术方法都是以双下划线开头,系统定义好关键字能识别)
(2)构造方法的目标是为了实现对象的初始化(用来初始化对象里面的资源)
对象实例化之后会自动调用
构造方法通常是为了实现对象所需资源的初始化(属性、资源)。
(3)构造方法虽然为魔术方法,但本质依然是一个方法(只是特性能够自动调用也可以普通调用)
受访问修饰限定符控制(意味着有些区域可以调用,有些区域可以产生对象,有些区域不能产生对象,代表对象的产生位置会发生改变)
对象可以选择调用(一般不会)
(4)构造方法可以设定形参,形参对应的实参是在实例化对象的时候传入:new 类名(实参传递给形参)
3、步骤
(1)确定类中需要有数据实现初始化,而且是灵活处理,每个对象都不一样的:使用构造方法(没有不需要)
(2)确定初始化的数据需要外部传入:使用构造方法设定形参
(3)在构造方法内部利用内部对象实现初始化需求
①属性初始化
②资源初始化
③其他内置方法调用
(4)实例化对象时必须传入构造方法所需数据
4、示例
(1)构造方法实现:在类中增加一个方法_construct()即可
class saler{
#构造方法
public function __construct(){
echo __CLAsS__;
}
}
(2)构造方法也是一个方法,不普通的地方在于,类实例化得到的对象会马上自动调用
# 实例化
new saler(); # 输出saler
05 construct.php 构造方法:
<?Php
#构造方法(魔术方法)
class Saler{
#构造方法
public function __construct(){
echo __CLASS__;
}
}
#实例化
new Saler();
结果:Saler
说明确实被调用。
(3)构造方法的意义:构造方法是对象实例化的时候用来初始化对象的资源的,所以通常是用来初始化对象的属性或者其他资源初始化
class saler{
# 属性
public $count;
private Smoney;
# 构造方法:初始化属性
public function_construct(){
$this->count=100;$this->money=100;
}
}
(4)如果属性的数据在构造方法中初始化是固定写死的,那么与直接在定义类的时候初始化属性一样。意味着数据没有任何价值(所有对象都相同),因此通常是通过构造方法的参数来实现数据的外部传入
class saler{
# 属性
public $count;
private $money;
# 构造方法:初始化属性
public function _construct($count,Smoney,{
$this->count = $count;
$this->money= $money;
}
}
如果没有资源要初始化没必要用构造方法,有了初始化资源之后在构造方法里面传入参数,对属性进行布置。
<?Php
#构造方法(魔术方法)
class Saler{
#属性
public $count;
private $money;
#构造方法
public function _construct($count,$money){
echo_CLASS_;
#初始化
$this->count $count;
$this->money $money;
}
}
#实例化
new Saler();
运行结果:
Fatal error. Uncaught ArqumentCountError:Too fewarquments to function Saler:construct()0 passecrin D:\serverWeb\05construct.php on line 22 and exactly2 expected in D:\server\Web\05construct.php:12 Stack trace:#0D:\ser verWeb\05constructphp(22): Saler->construct()#1(main) thr own in D:\server\Web\05construct.php on line 12
系统告诉运行错误,给构造方法传入太少参数,22行出错,需要两个参数只给了 0个
<?Php
#构造方法(魔术方法)
class Saler{
#属性
public $count;
private $money;
#构造方法
public function _construct($count,$money){
echo_CLASS_;
#初始化
$this->count $count;
$this->money $money;
}
}
#实例化
new Saler(100,100);
调用结果:Saler
没有问题,此时只是对象并没有存,所以走到这个地方再往下面走的时候,系统发现内存没有人用,因此要用通常会用一个变量来保存一个变量来保存好。
<?Php
#构造方法(魔术方法)
class Saler{
#属性
public $count;
private $money;
#构造方法
public function _construct($count,$money){
echo_CLASS_;
#初始化
$this->count $count;
$this->money $money;
}
}
#实例化
$s1 = new Saler(100,100);
var_dump($s1);
执行结果:
Salerobject(Saler)#1(2)([count”]=>jnt(100)[“mone y”:"Saler":private]=>int(100)}
有值,原来没有值。
#实例化
$s1 = new : Saler(100,100);
$s2 = new Saler(1,1);
var_dump($s1,$s2);
不同的对象结果:
SalerSalerobject(Saler)#1(2)([count]=>int(100)[money:"Saler":private]=>nt(100)}object(Saler)#2(2)((’count”]=>int1)["money ":Saler*:private]=> int(1))
第一个对象为 1 里面编号为100,100两个属性,第二个对象编号为 2 ,同样两个属性编号为1,1 ,说明两个对象彼此互不干扰。
(5)一旦构造方法拥有了形参,那么对象在调用该方法的时候就需要传入对应的实参,而构造方法又是自动调用的,所以需要在实例化对象的时候使用 new 类名(构造方法对应的实参列表)来实现
# 实例化对象
Ss1=new Saler(100,100);
$s2=new saler(1000,1000);
$s3 = new saler; # 错误:因为此时类有构造方法且要求传入参数,所以必须使用()并传入数据
注意:之前所说的 new 类名和 new 类名()没有区别是因为没有构造方法,或者构造方法没有参数限定,一旦构造方法有了参数,那么 new 类名就不能直接使用了。
(6)构造方法不管再怎么特殊,也是用户定义的方法,言外之意除了在实例化对象时对象会自动调用之外,我们也可以手动调用构造方法(但是一般没有价值,因为对象实例化时会自动调用)
class saler{
# 属性
public $count;
private Smoney;
# 构造方法:初始化属性
public function _construct($count,$money){
$this->count = $count;
$this->money= $money;
}
}
# 实例化
Ss=new saler(100100); # 系统在new Saler(100.100)好之后,会自动调用一次
$s->__construct(1000,1000); #允许手动调用
<?Php
#构造方法(魔术方法)
class Saler{
#属性
public $count;
private $money;
#构造方法
public function _construct($count,$money){
echo_CLASS_;
#初始化
$this->count $count;
$this->money $money;
}
}
#实例化
$s1 = new Saler(100,100);
$s2 = new Saler(1,1);
// var_dump($s1,$s2);2627
$s2->_construct(0,0);
var_dump($s1,$s2);
执行结果:
SalerSalerSalerobject(Saler)#1(2)([count]=>int(100) ["money":"Saler":private]=>int(100)}object(Saler)#2(2){["count]=>int(0)["money":"Saler":private]=> int(0))
之前是100,100、1,1 现在变成了0,0,说明调用时成功的,系统调用一般自动调用一次就可以。
5、小结
(1)构造方法 _construct() 是一种系统内置的方法,该方法的特性是会在对象实例化之后,对象立即自动调用
(2)构造方法的目的就是为了初始化资源,包含对象属性和其他资源
(3)一旦构造方法定义好之后,且构造方法自带参数,那么就只能使用 new 类名(参数列表)方式才能正确实例化
(4)构造方法可以当做普通方法由对象调用(不建议)
魔术的特点在于会自动调用,不需要手动去操作。