oriented object
programming(oop):面向对象编程
1、php面向对象编程------类与对象
2、php面向对象编程------构造方法
php面向对象编程
学习目标:
1、 初步掌握php中的类与对象;
2、 各种变量在内存中存在形式分析;
3、 什么是成员属性和成员方法;
4、 掌握构造方法/析构的使用;
从类到对象,目前有几种说法:
1、创建一个对象;2、实例化一个对象;3、把类实例化; 这三种说法都是一样的。
类与对象的区别和联系:
① 类是抽象的,概念的,代表一类事物,比如人类、猫类。。。
② 对象是具体的,实际的,代表一个具体的事物;
③ 类是对象的模板,对象是类的一个个体实例。
定义类
class 类名{
成员属性(变量);
}
u 成员属性的说明
1、 成员属性是从某个事物提取出来的,它可以是基本数据类型(整数、小数、字符),也可以是复合数据类型(数组、对象)。
创建对象(两种方法)
① $对象名=new 类名();
② $对象名=new 类名;
访问(使用)成员属性(其成员属性名是public)
语法:$对象名->属性名;
//创建一个类
class cat{
public $name;
public $age;
}
//创建对象
$cat1=new cat;
//给某个对象赋值
$cat1->name=”小明”;
//访问某个对象的某个属性 $对象名->属性名
echo $cat1->name;
如果一个文件,专门用于定义了类,则取名的规范是
类名.class.php
对象在内存中的存在形式:
案例1:
//定义一个人类
class person{
public $name;
publid $age;
}
$a=new person();
$a->name=”小明”;
$a->age=20;
//把a变量(对象)赋给$b;
$b=$a;
echo $a->name.”
”;
echo $b->name.”
”;
输出:
小明
小明
内存图:
如果给一个函数传递的是一个对象,实际上传递的是一个地址!!!
案例2:
$a=78;
$b=$a;
$b=&$a;
$b=$b+8;
echo $a. “||”.$b;
输出:78||86
2$a=78;
//$b=$a;
$b=&$a;
$b=$b+8;
echo $a."||".$b;
输出:86||86
class person{
public $name;
public $age;
}
$p1=new person();
$p1->name="李冰冰";
$p1->age=33;
//函数接收对象的时候,是传入值还是地址?!!!
function test1($p){
$p->name="小明";
}
test1($p1);
echo $p1->name;
内存图:
如果给函数传递的是基本数据类型(整数、小数、布尔、字符串),究竟传递的是地址还是值?
**在默认情况下传递的是值,如果你希望传入的是地址则 function test(&$变量名){}
在php中,如果给一个函数传递的是数组,则默认情况下是传值(相当于拷贝了新的数组),如果希望传入地址,也应当:&$数组名
//给一个函数传递基本数据类型
$a=90;
$b=90.8;
$c=true;
$d="hello";
function test1($a,$b,$c,$d){------à(&
$a,&$b,&$c,&$d)
$a=78;
$b=89.7;
$c=false;
$d="world";
}
//调用函数
test1($a,$b,$c,$d);
echo $a."||".$b."||".$c."||".$d;
结果:90||90.8||1||hello---à(78||89.7||||world)
l 成员方法:
函数和成员方法的关系:当我们把一个函数写到某个类中,则该函数可以称为成员方法。
案例:
① 添加speak成员方法输出:我是一个好人;
② 添加jisuan成员方法可以计算1+2+……+1000的结果;
③ 修改jisuan成员方法,该方法可以接收一个数n,计算1+….+n的结果;
④ 添加add成员方法,可以计算两个数之和;
成员方法的基本语法:
访问修饰符号(暂时是public) function 函数名(参数列表){
//函数体;
//return;(可选)
}
参数可以是多个并且可以是任意类型:整数,小数,对象,数组等;
案例:
class person{
public $name;
public $age;
//添加一个speak成员方法
public function speak(){
echo "我是一个好人!";
}
//添加一个count1成员方法
public function count1(){
$res=0;
for($i=1;$i<2000;$i++){
$res+=$i;
}
//return返回到什么地方?谁调用返回给谁
return $res;
}
//修改count成员方法
public function count2($n){
$res=0;
for($i=1;$i
$res+=$i;
}
return $res;
}
//添加一个add成员方法,计算两数之和(接收2个参数)
public function add($num1,$num2){
return $num1+$num2;
}
}
//如何使用函数?
//创建一个人
$p1=new person();
//通过对象去访问,调用成员方法
//这里强调,调用成员方法和调用普通函数的机制,仍然不变
//for($i=0;$i<20;$i++){
$p1->speak();
//}
//计算1-2000的和
$res=$p1->count1();
echo "计算结果是:".$res;
//修改count成员方法,计算1---n的和,接收一个数
echo "计算结果是=".$p1->count2(1000);
//接收2个参数
echo "两数之和是:".$p1->add(100,250);
成员方法细节:
在实际开发中,应该这样用,单独写一个类文件,要用的使用引入。
有一个person.class.php的类文件;要用时:
require_once
‘person.class.php’; ///引入文件
$p1->new
person(); ///创建一个对象
调用方法
① 参数是数组类型();
案例:
class person{
public $name;
public $age;
//参数是数组类型的成员方法
public function findmax($arr){
$maxval=$arr[0];
$maxindex=0;
for($i=1;$i
if($maxval
$maxval=$arr[$i];
$maxindex=$i;
}
}
return $maxval;
}
$p1=new person();
$myarr=array(50,45,89,12,-20,900,78);
echo "
最大数是:".$p1->findmax($myarr);
输出:最大数是:900
② 方法可以没有返回值;
案例1:编写一个程序,用面向对象的方式,从网页输入一个整数打印出对应的金字塔。
创建三个文件如:myinputview.php(界面),print.php(接收myinputview.php提交的数据),xxx.class.php(定义类)。
先设计类(定属性/成员方法);
然后根据类创建对象。
myinputview.php文件:
请输入层数:
xxx.class.php文件
class xxx{
//接收一个数据,并打印出对应的金字塔
public function printstar($n){
//使用for
for($i=1;$i<=$n;$i++){
//先打印空格
for($k=1;$k<=$n-$i;$k++){
echo " ";
}
//打印*个数
for($j=1;$j<=($i-1)*2+1;$j++){
echo "*";
}
echo "
";
}
}
}
print.php文件
//引入xxx.class.php文件
require_once 'xxx.class.php';
//接收myinputview提交的数据并处理
$layer=$_request['layer'];
//调用对象
//创建
$xxx1=new xxx();
$xxx1->printstar($layer);
案例2
设计一个计算机类:
属性:品牌 颜色 cpu型号 内存容量 硬盘大小 价格 工作状态
方法:打开 关闭 休眠
创建一个计算机对象,调用打开、关闭、休眠方法
computer.class.php文件
//属性:品牌 颜色 cpu型号 内存容量 硬盘大小 价格 工作状态
//方法:打开 关闭 休眠
//创建一个计算机对象,调用打开、关闭、休眠方法
class computer{
//属性
public $brand;
public $color;
public $cpu;
public $memory;
public $hardisksize;
public $price;
public $status;
//方法
public function open(){
echo "打开......";
}
public function close(){
echo "关闭......";
}
public function computersleep(){
echo "休眠中......";
}
}
exercise.php文件
//使用computer类
require_once 'computer.class.php';
//创建计算机对象
$computer1=new computer();
//调用方法
$computer1->open();
$computer1->close();
$computer1->computersleep();
练习:
一、用面向对象的方法实现:爱玩游戏的猪!
1、 输出自己的名字、体重、年龄、颜色;
2、 可以增加自己的体重/减轻自己的体重;
3、 可以打印金字塔(层数随意);
4、 可以打印空心金字塔(层数随意);
5、 可以打印菱形;
6、 继续改进,可以打印空心菱形;
二、编写一个cat类,要求如下:
该猫可以做四则运算,也可以进行面积计算
分析 :有几个php文件?
①
显示界面:catview.php;
② 猫工作的文件 :catwork.php ,猫计算(接收数据)
引入猫类class文件,require_once ‘cat.class.php’;
创建一个猫对象:$cat1=new
cat();----要写在外面jisuan()的外面,否则在别的function用不了!
$doing=$_request[‘doing’];------接收隐藏域的name值
if($diong==jisuan){
接收数据:$num1=$_request[‘num1’];
接收数据:$num2=$_request[‘num3’];
接收数据:$oper=$_request[‘oper’];
echo
“计算结果是=”.$cat1->jisuan($num1,$num2,$oper)
}else if($doing==area){
$radius=$_request[‘radius’];这里是计算圆形的面积代码
}else{
接收长和宽计------算矩形的面积
}
可以写个超链接 :返回主界面
为了区分不同的请求,可以使用隐藏域(hidden),这是经常用到的(即如何区分猫是进行四则运算还是进行面积计算)
② 猫类文件:cat.class.php
定义一个猫类 :class cat{};
猫可以做计算
成员方法:
function circlearea($)
function
jisuan($num1,$num2,$oper){}
2、进一步形成如图的效果:
这个要用到js技术根据不同的需求显示不同的界面
在radio里面分别设置onclick点击事件name=”seltype(‘jishuan’)”;
name=”seltype(‘area’)”
在各个table里可以设置 style=“display:none/block”,在js里设置function
seltype(val)函数,判断条件,当val=jisuan时table1中的display值为block,table2中display值为none,依次进行判断,访问display的值的方法:table1.style.display=none/block;
实现点击不同的radio时不同block的切换!!!