PHP笔记_7(面向对象—》类、类的创建、构造方法、成员方法)
发布时间:2024-11-17
发布时间:2024-11-17
该笔记是关于韩顺平老师PHP课程的笔记
PHP面向对象编程—类与对象 PHP面向对象编程—构造方法 学习目标: 1、 2、 3、 4、
初步掌握PHP中的类和对象 各种变量在内存中的存在形式分析 什么是成员属性和成员方法 掌握构造方法和析构方法
该笔记是关于韩顺平老师PHP课程的笔记
//类名的命名方式:首字母大写,使用驼峰发,例如MyCatWork,而不要使用
my_cat_work
对象赋值:对象名—>属性名 = 值;
该笔记是关于韩顺平老师PHP课程的笔记
如果有一个文件,专门用于定义类,则命名规范应当这样: 类名.class.php
以下的图片是类和对象在内存中的存储的分析图:
class person { public $name; public $age; }
$a = new person(); $a->name = "小明"; $a->age = 20; $b = $a;
该笔记是关于韩顺平老师PHP课程的笔记
echo $a->name.'||'.$a->age.'<br>'; echo $b->name.'||'.$b->age.'<br>';
以上代码的输出结果是相同的:小明||20 小明||20
分析如下:堆区是存放大数据的,比如对象;栈区存放的是小型数据,比如float、int等类型的数据;这句代码$a = new person();在栈区中创建一个对象,并且$a存放的是一个地址,$b = $a;这句代码,相当于是将$a中存放的地址赋值给$b,这样就使得$b和 $a指向的是同一个地址,因此输出的内容也是一样的。
如果将上面的代码变动下; 在$b = $a;后面加上这一句$b->age = 890;然后输出$b->age.和$a->age.
echo '$b->age='.$b->age.'<br>'; echo '$a->age='.$a->age.'<br>';
输出的结果:$b->age=890 $a->age=890 (结果是一样的) 分析:上面已经分析$b和 $a指向的是同一个地址,那么$b->age = 890;该句代码对于$b指向的内容进行更改,而$a和$b指向的是同一个地址,因此输出的结果自然是相同的
知识点:给函数传递一个对象,具体是传什么?【函数调用的时候,代码运行,开辟的是新栈】(代码如下) class person { public $name; public $age; }
$p1 = new person(); $p1->name = "对象"; $p1->age = 30;
function test1 ($change) { $change->name = "想回家"; }
test1($p1);
echo $p1->name;
以上的代码的输出结果是:想回家
分析:给函数传递一个对象,传递的是对象的地址,因此这句代码$change->name = "想回家";就对$p1->name = "对象";这句代码的值进行修改,即$p1->name的值为“想回家”。
知识点总结:如果给一个函数传递一个对象,实际上传递的是一个地址
该笔记是关于韩顺平老师PHP课程的笔记
//如果给一个函数传递的是基本数据类型,那么传递的是什么 $a = 50; //整形 $c = 45.55; //小数
$d = "hello,word"; //字符串 $bool = true; //布尔类型
$arr = array(43,"你好",96.69); //数组 function test2 ($b1, $b2, $b3, $b4, $barr) { $b1 = 90; //整形 $b2 = 99.9999; //小数 $b3 = "how,are,you"; //字符串 $b4 = false; //布尔类型 $barr[0] = 1314; //数组 }
test2($a,$c,$d,$bool,$arr);
echo '$a(50) = '.$a.'<br/>'; echo '$c(45.55) = '.$c.'<br/>';
echo '$d (hello,word)= '.$d.'<br/>'; echo '$bool (true)= '.$bool.'<br/>'; echo 'arr[0] (43)= '.$arr[0].'<br/>';
输出的结果是: $a(50) = 50
$c(45.55) = 45.55
$d (hello,word)= hello,word $bool (true)= 1 arr[0] (43)= 43
对上面的代码加上去地址符后的输出结果:
$a(50) = 90
$c(45.55) = 99.9999
$d (hello,word)= how,are,you $bool (true)= arr[0] (43)= 1314
分析:通过上面的例子可以的出,如果给一个函数传递的是基本数据类型,传递的就不是地址,而是变量的值。
知识点总结:在默认的情况下如果给一个函数传递的是基本数据类型,实际上传递的是变量的值。如果要传递地址,只
该笔记是关于韩顺平老师PHP课程的笔记
要在函数的形式参数中加上去地址符【&】就可。
▲ 疑问(△面试中会经常遇到的)代码如下:
$arr = array($a,$b); $a = array(12, 15, 19); $b = array(20, 25, 99); print_r($arr);
结果是:出现notice错误,并且打印出Array ( [0] => [1] => )
如果将上面的代码改变如下: $a = array(12, 15, 19); $b = array(20, 25, 99); $arr = array($a,$b); print_r($arr);
输出结果是:Array ( [0] => Array ( [0] => 12 [1] => 15 [2] => 19 ) [1] => Array ( [0] => 20 [1] => 25 [2] => 99 ) )
总结:只有在定义$a和$b后才能够这样使用$arr = array($a,$b);否则会报错
该笔记是关于韩顺平老师PHP课程的笔记
请看下面的案例: class Pig { public $name; public $weight;
该笔记是关于韩顺平老师PHP课程的笔记
public $age; public function addWeight($a) { //$weight = $weight +$a;//这里PHP会认为是重新定义了一个新的变 量 $this->weight = $this->weight +$a;//应该在前面加上$this } }
$pig1 = new Pig(); $pig1->weight = 100; $pig1->addWeight(10);
echo "猪的体重".$pig1->weight;
输出结果是:猪的体重
110
在PHP5中可以有两种形式的构造方法如上图的3和4;但优先选择4这种方法
该笔记是关于韩顺平老师PHP课程的笔记
this就是对象本身,即调用对象的地址
一个类只能有一个构造方法
该笔记是关于韩顺平老师PHP课程的笔记
关于构造方法(构造函数)的一些知识点的代码如下: class Person { public $name; public $age; //构造方法,如果没有该构造方法,其实PHP有默认的一个构造方法 /*public function __construct($iname,$iage) { $this->name = $iname; $this->age = $iage; }*/ //php默认的构造方法如下,注:如果没有修饰符,其实PHP已经默认修饰符为public function __construct( )//注意:一个类只能有一个构造方法 {
该笔记是关于韩顺平老师PHP课程的笔记
}
}
//$p1 = new Person();//这样创建一个对象是错的,因为创建了一个构造方法,所以在创建的时候要给其默认值
$p1 = new Person("小明",30);//正确的创建一个对象的方式,注:谁引用,$this就是代表该对象的地址
$p1 = new Person();//在默认的构造方法下,这样创建一个对象是正确的,不会报错
echo $p1->name;