构造方法|学习笔记

简介: 快速学习构造方法

开发者学堂课程【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)构造方法可以当做普通方法由对象调用(不建议)

魔术的特点在于会自动调用,不需要手动去操作。

相关文章
|
7月前
|
Java 编译器
Java入门-------构造方法和构造方法的重载
Java入门-------构造方法和构造方法的重载
|
8天前
|
Java C# C++
构造方法大揭秘:编程新手也能轻松掌握!
构造方法大揭秘:编程新手也能轻松掌握!
14 0
|
8天前
类的无参方法
类的无参方法
11 0
|
8天前
|
Java
【Java this关键字】如何使用以及注意点 访问成员变量,访问成员方法,构造方法内调用构造方法
【Java this关键字】如何使用以及注意点 访问成员变量,访问成员方法,构造方法内调用构造方法
|
6月前
|
Java 编译器
【类和对象之构造方法】
【类和对象之构造方法】
38 0
|
8月前
|
Java
构造方法
构造方法
27 0
|
C++
C++类的静态方法
C++类的静态方法
64 0
|
Java C#
C# 构造方法
应用场景:1. 初始化(加载)对象 2. 初始化(加载)一些数据 特点:默认有一个无参构造方法
72 0
|
Java Scala 开发者
伴生对象和伴生类的小结|学习笔记
快速学习伴生对象和伴生类的小结。
145 0
伴生对象和伴生类的小结|学习笔记
|
开发者 Python
类方法和静态方法 | 学习笔记
快速学习类方法和静态方法,介绍了类方法和静态方法系统机制, 以及在实际应用过程中如何使用。
82 0
类方法和静态方法 | 学习笔记

热门文章

最新文章