陈力:传智播客古代 珍宝币 泡泡龙游戏开发第31讲:PHP面向对象程序设计(成员方法)
在PHP程序设计语言中,如何进行面向对象的程序设计呢?PHP程序设计中,通过class 创建类,通过public申明公有成员变量,通过new()进行类的实例化,引用时通过$实例名->成员名。本文对PHP面向对象的程序设计知识进行介绍。本节陈力:传智播客古代 珍宝币 泡泡龙游戏开发第31讲:PHP面向对象程序设计(成员方法)。
一、php面向对象编程
在php程序设计语言初期,并不支持面向对象程序设计,但计算机语言的发展是向接近人的思维方式演变的,这是一个大趋势。PHP之父Rasmus Lerdorf在设计php4时,就引入的面向对象的思想,在php5中就全面支持面向对象编程了,这让php看起来很像java等语言。
问题引入:张老太养了两只猫猫:一只名字叫小白,今年3岁,白色。还有一只叫小花,今年100岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示张老太没有这只猫。
如果通过现有的知识来解决这个问题,其程序代码如下:
<?php
$cat1_name=”小白”;
$cat1_age=3;
$cat1_color=”白色”;
$cat2_name=”小花”;
$cat2_age=100;
$cat2_color=”花色”;
?>
这样的程序设计有一个大问题,就是要找一只猫时,要分别找到各个变量,这样造成了资源浪费,不是合理的程序设计方式。我们能不能把属于同一事物的 变量进行统一管理呢?引入对象概念是一个很好的解决办法。快速体验案例PHP程序设计代码如下:
<?php
class Cat{
public $name;
public $age;
public $color;
}
//创建一只猫
$cat1=new Cat();
$cat1->name="小白";
$cat1->age=3;
$cat1->color="白色";
$cat2=new Cat();
$cat2->name="小花";
$cat2->age=100;
$cat2->color="颜色";
//如果贵阳网站建设人员要找一只猫,只需要找到$cat1,就可以找到该对象所有相关的属性。
$findCatName="小花";
if($cat2->name==$findCatName){
echo $cat2->name."||".$cat2->age."||".$cat2->color;
}
?>
贵阳网站建设的朋友需要注意:我们这里说明一下类和对象的关系。类和对象的区别和联系可以总结出:1)类是抽象的,代表一类事物。2)对象是具体的,是类的一个具体实例。3)类是对象的模板, 对象是类的一个个体实例。
二、定义类、创建对象
贵阳网站建设人员要透彻的掌握类,必须先了解类的构成,类的定义语法如下:
Class 类名{
成员属性(变量);
}
类-成员属性(变量):成员变量是类的一个组成部分,一般是基本数据类型(整数,字符串),也可是复合类型(类、数组)。比如我们前面定义猫类的public $age 就是成员变量。
如何创建对象:
$对象名=new 类名();
$对象名=new 类名;
对象如何访问(使用)对象的属性:
$对象名->属性名;
实例:定义一个人类(Person)(包括 名字,年龄)。
class Person{
public $name;
public $age;
}
$p1=new Person();
$p1->name="张三";
$p1->age=90;
$p2=$p1;
$p2->name="小明";
echo $p2->name;
echo ' '.$p1->name;
输出结果:小明 小明
请问:$b->age究竟是多少?
PHP程序设计语言中对象是按引用传递的,即每个包含对象的变量都持有对象的引用(reference),而不是整个对象的拷贝。
三、对象在内存中存在的形式
//定义一个人类
class Person{
public $name;
public $age;
}
$a=new Person();
$a->name="小明";
$a->age=20;
//把a变量(对象),赋给$b
$b=$a;
echo $a->name."<br/>";
echo $b->name."<br/>";
案例说明:
$a=78;
$b=$a;
$b=$b+8;
echo $a."||".$b;
$a=78;
$b=&$a;
$b=$b+8;
echo $a."||".$b;
在内存中,$a是在栈区,指向了个一内容为78的地址,如果$b=$a;相当于把$a的值传给$b,所以,$b=78;对其加8后值为86。$a值不变。如果将$a的地址传给$b,由$a和$b都指向同一地址空间,对$b进行加8,也是对$a进行加8。因此输出$a和$b都是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){//传入发址时,将影响外面的变量。
function test1($a,$b,$c,$d){//传递值时,外面的变量不会受到影响。
$a=78;
$b=89.6;
$c=false;//php输出时是一个空串,表示false的意思。
$d="beijing";
}
test1($a,$b,$c,$d); //调用函数
echo $a."||".$b."||".$c."||".$d;*/
?>
在php程序设计语言中如果给一个函数传递的是数组,则默认情况下是传值方式(就是复制了原来数组中的值到新的数组中),如果希望传入地址,则应当用&$数组名。
四、成员方法
在贵阳网站建设中,经常需要定义成员方法。比如设计一个人类:除了有一些属性外(年龄,姓名,身高..),人类还有一些行为(说话、跑步、学习、做算术题)。在这种情况下,就要用成员方法才能完成这些功能,现在要求对Person类进行完善。
函数和成员方法关系:当我们把一个函数写到某个类中,则该函数可以称成员方法。
实例:有一个需求: 希望人说话,做算术题.......这样就需要使用到成员方法:
1)添加speak 成员方法,输出“我是贵阳网站建设人员”。
2)加jisuan 成员方法,可以计算从 1+..+1000的结果。
3)改jisuan 成员方法,该方法可以接收一个数n,计算 1+..+n 的结果。
4)添加add 成员方法,可以计算两个数的和。
成员方法的基本语法:
访问修饰符号 function 函数名(参数列表){
//函数体
//return 语句;
}
实例代码:
<?php
class Person{
public $name;
public $age;
public function speak(){
echo "我是贵阳网站建设人员";
}
public function count1(){
$res=0;
for($i=1;$i<=1000;$i++){
$res+=$i;
}
//return 究竟到什么地方去?哪个对象调用,就返回给哪个对象。
return $res;
}
//修改jisuan成员方法,该方法可以接收一个数n,计算1+…+n的结果。
public function count2($n){
$res=0;
for($i=0;$i<=$n;$i++){
$res+=$i;
}
return $res;
}
//添加add 成员方法,可以计算两个数的和。
public function add($num1,$num2){
return $num1+$num2;
}
}
//如何使用函数呢
//首先创建一个人实例
$p1=new Person();
//其次通过对象去访问,调用成员方法。
//这里强调,调用成员方法和调用普通函数的机制是一样的。
$p1->speak();
$res=$p1->count1(); //让人做算术题。
echo '计算结果是='.$res;
//让人可以接收一个数,然后累加计算
echo "计算结果是=".$p1->count2(100);
echo "计算结果是=".$p1->count2(100);
echo "计算结果是=".$p1->count2(100);
echo "23+89=".$p1->add(23,89);
?>
调用成员方法时,PHP程序设计语言会自动开启一个新栈,用以留存其中的变量等信息。
在贵阳网站建设实际项目开发中,通常用一个专业的class.php文件来存放类,用一个view.php来显示界面。
实例:
Person.class.php代码:
<?php
class Person{
//成员属性
public $name;
public $age;
//成员方法
public function speak(){
echo "我是贵阳网站建设人员!";
}
public function count1(){
$res=0;
for($i=1;$i<=1000;$i++){
$res+=$i;
}
return $res;
}
//修改jisuan成员方法,该方法可以接收一个数n,计算 1+..+n 的结果
public function count2($n){
$res=0;
for($i=0;$i<=$n;$i++){
$res+=$i;
}
return $res;
}
//添加add 成员方法,可以计算两个数的和。
public function add($num1,$num2){
return $num1+$num2;
}
//添加一个新的方法,可以判断三个数最大的数。
public function findMax($arr){
//从$arr数组中,找到最大的数.
//1.假设数组的第一个数就是最大的数
$maxVal=$arr[0];
//2.最大数的下标
$maxIndex=0;
//开始循环的比较
for($i=1;$i<count($arr);$i++){
if($maxVal<$arr[$i]){ //这个条件说明maxVal不是最大
$maxVal=$arr[$i]; //调整
$maxIndex=$i;
}
}
return $maxVal;
}
}
?>
对该类进行测试的代码如下:
<?php
require_once ‘Person.class.php’; //引入类文件
$p1=new Person();//创建对象
$p1->speack();//调用$p1的各个方法
$p1->count1();
$myArr=array(3,90,90);
echo "<br/>最大的数是=".$p1->findMax($myArr);
?>
实例:设计计算机类,要求如下:
属性:品牌,颜色,cpu型号,内存容量,硬盘大小,价格,工作状态
方法: 打开,关闭,休眠 (表示)
创建一个计算机对象,调用打开,关闭方法。
代码如下:
<?php
//属性:品牌,颜色,cpu型号,内存容量,硬盘大小,价格,工作状态
//方法: 打开,关闭,休眠 (表示)
//创建一个计算机对象,调用打开,关闭方法.
class Computer{
//属性
public $brand;
public $color;
public $cpu;
public $memory;
public $hardDiskSize;
public $price;
public $status;
//方法
public function open(){
echo "<br/>打开计算机....";
}
public function close(){
echo "关机";
}
public function computeSleep(){
echo "<br/>计算机休眠中....";
}
}
?>
调用代码:
<?php
//使用Computer类
require_once 'Computer.class.php';
//创建计算机
$computer1=new Computer();
$computer1->open();
$computer1->computeSleep();
$computer1->close();
?>
实例:请编写一个Pig 类,可以完成
(1)输出自己的名字,体重,年龄,颜色
(2) 可以增加自己的体重/减轻自己的体重
(3) 可以打印金字塔,层数随意
代码:
<?php
class Pig{
//属性
public $name;
public $weight;
public $color;
public $age;
//成员方法
public function addWeight($a){
// $this->weight= $this->weight+$a;
//如果我们直接使用 $weight,php认为我们创建了一个新的变量
$this->weight=$this->weight+$a;
}
public function minusWeight($a){
$this->weight=$this->weight-$a;
}
public function showWeight(){
echo "猪重=".$this->weight;
}
public function printStar($n){
//写出打印金子塔的代码..
}
}
?>
调用代码:
<?php
require 'Pig.class.php'; //使用类
//Pig类写在单独的一个文件中.Pig.class.php
$pig1=new Pig();//创建一只猪
$pig1->weight=100;
$pig1->addWeight(10); //增加体重
echo "猪重=".$pig1->weight;
$pig1->printStar(4);
?>
按输入的层数打印金字塔的代码:
MyInputView.php
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
</head>
<form action="Print.php" method="post">
请输入层数:<input type="text" name="layer"/>
<input type="submit" value="打印"/>
</form>
</html>
Print.php代码:
<?php
require_once 'Abc.class.php'; //引入Abc.class.php文件
//接收MyInputView.php提交的数据并处理
$layer=$_REQUEST['layer'];
$abc1=new Abc();//1.创建
$abc1->printStar($layer); //调用对象
?>
Abc.class.php代码:
<?php
class Abc{
//接收一个数,并打印对应的金字塔
public function printStar($n){
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 "<br/>";
}
}
}
?>
实例:请编写一个Cat 类,要求如下:该猫可以做四则运算,也可以进行面积计算:
Cat.class.php源代码:
<?php
//定义一只猫,类名首字母大写 ,使用MyCat
class Cat{
function circleArea($radius){ //猫可以计算圆形
return 3.14*$radius*$radius;
}
function jiSuan($num1,$num2,$oper){ //成员方法
$res=0;
if($oper=="+"){
$res=$num1+$num2;
}else if($oper=="-"){
$res=$num1-$num2;
}else if($oper=="*"){
$res=$num1*$num2;
}else {
$res=$num1/$num2;
}
return $res;
}
}
?>
CatView.php代码:
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
</head>
<form action="CatWork.php" method="post">
<h1>四则运算</h1>
第一个数:<input type="text" name="num1"/><br/>
第二个数:<input type="text" name="num2"/><br/>
运算符号:
<select name="oper">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
<br/>
<!--这里使用一个隐藏域-->
<input type="hidden" name="doing" value="jisuan"/>
<input type="submit" value="开始计算"/>
</form>
<br/><br/>
<form action="CatWork.php" method="post">
<h1>运算圆形面积</h1>
请输入半径:<input type="text" name="radius"/><br/>
<br/>
<!--这里使用一个隐藏域-->
<input type="hidden" name="doing" value="area"/>
<input type="submit" value="开始计算面积"/>
</form>
</html>
CatWork.php代码:
<?php
require_once 'Cat.class.php';
$doing=$_REQUEST['doing']; //首先接收doing值
$cat1=new Cat();//创建猫,这里要把$cat1定义写在外面。
if($doing=="jisuan"){
//1.接收 num1
$num1=$_REQUEST['num1'];
//2.接收 num2
$num2=$_REQUEST['num2'];
//3.接收 运算符
$oper=$_REQUEST['oper'];
echo '计算结果是='.$cat1->jiSuan($num1,$num2,$oper);
}else if($doing=="area"){
$radius=$_REQUEST['radius']; //接收用户输入的半径
echo '计算结果是='.$cat1->circleArea($radius);
}
?>
<br/>
<a href="CatView.php">返回主界面</a>
实例:将四则运算器和面积运算器合二为一,作一个运算器,主菜单让用户选择是做四则运算还是面积运算,分为两个子菜单,让用户选择加减乘除或者形状(比如对矩形计算)。如下界面:
SmartCatView.php代码:
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<script language="javascript">
<!--
function selType(val){
if(val=='jisuan'){
//显示计算的界面,同时隐藏矩形界面
table1.style.display="block";
table2.style.display="none";
}else if(val=='area'){
//显示矩形的界面,同时隐藏计算界面
table1.style.display="none";
table2.style.display="block";
}
}
//-->
</script>
</head>
<h1>聪明猫</h1>
<form action="SmartCatWork.php" method="post">
<input type="radio" name="sel" value="aa" οnclick="selType('jisuan')" >四则运算
<input type="radio" name="sel" value="bb" οnclick="selType('area')">计算矩形
<!--dispaly: none 表示不显示-->
<table id="table1" style="display:block">
<tr><td>请输入第一个数</td><td><input type="text" name="num1"/></td></tr>
<tr><td>请输入第二个数</td><td><input type="text" name="num2"/></td></tr>
<tr><td>请选择运算符号</td><td>
<select name="oper">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
</td></tr>
<tr><td colspan="2"><input type="submit" value="四则运算"/></td></tr>
</table>
<!--下面这个table 我们用于显示矩形-->
<table id="table2" style="display:none">
<tr><td>请输入长</td><td><input type="text" name="long"/></td></tr>
<tr><td>请输入宽</td><td><input type="text" name="width"/></td></tr>
<tr><td colspan="2"><input type="submit" value="矩形计算"/></td></tr>
</table>
</form>
</html>
【推荐阅读】
陈力:传智播客古代 珍宝币 泡泡龙游戏开发第31讲:PHP面向对象程序设计(成员方法)