陈力:传智播客古代 珍宝币 泡泡龙游戏开发第31讲:PHP面向对象程序设计(成员方法)

陈力:传智播客古代 珍宝币 泡泡龙游戏开发第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 "&nbsp;"; //先打印空格
    }
    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面向对象程序设计(成员方法)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值