2020-03-02 17:21:10 来源:范文大全收藏下载本文
php面向对象编程 提出一个问题?
张老太养了两只猫猫:一只名字叫小白,今年3岁,白色。还有一只叫小花,今年100岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示张老太没有这只猫猫。 数组对象
array(1,56,90,100) ->隐藏问题array(对象,对象。。。) 【数组对象】 首先我们用现有的知识来完成这个案例: <?php
$cat1_name=”小白”;
$cat1_age=3;
$cat1_color=”白色”;
//变量是分开.$cat2_name=”小花”;
$cat2_age=100;
$cat2_color=”花色”; ?>
我们能不能把属于同一事物的变量,统一管理? 解决之道->对象 快速体验案例: <?php
//这就是一个类(猫类) cla 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; } ?>
我们这里说明一下类和对象的关系(细节后面逐步展开)
总结几句话:
①
类是抽象的,代表一类事物 ②
对象是具体,是类的一个具体实例 ③
类是对象的模板, 对象是类的一个个体实例
php面向对象编程
成员属性的说明
1.
成员属性是从某个事物提取出的,它可以是基本数据类型(整数、小数、字符、布尔),也可以是复合数据类型(数组、对象) <?php
cla Cat{ public $name; public $age; }
//创建对象
$cat1=new Cat;
$cat1=new Cat(); ?>
2.
怎样访问一个成员属性(其它成员属性是public) 基本语法是 $对象名->属性名;
☞如果一个文件,专门用于定义类,则命名规范应当这样
类名.cla.php 分析对象在内存中存在的形式 //定义一个人类 cla Person{ public $name; public $age; } $a=new Person(); $a->name="小明"; $a->age=20; //把a变量(对象),赋给$b $b=$a; echo $a->name.""; echo $b->name."";
再次说明: $a=78; //$b=$a; $b=&$a; $b=$b+8; echo $a."||".$b;
如果给一个函数传递一个对象,实际上是传递的一个地址.//看下面的一段代码: cla 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中如果,给一个函数传递的是数组,则默认情况下是传值(拷贝了新的数组),如果希望传入地址,则应当,&$数组名 学生问题? <?php
$a1=array(1,3,900); $a2=array(56,90,100);
$arr=array($a1,$a2);
foreach($arr as $k=>$v){
echo “$k=$v”; } ?>
成员方法的讲解 函数和成员方法关系:
当我们把一个函数写到某个类中,则该函数可以称成员方法:
我们有这样一个需求; 希望人可以说话, 做算术题.......,这样就需要使用到成员方法: ①添加speak 成员方法,输出我是一个好人
②添加jisuan成员方法,可以计算从 1+..+1000的结果
③修改jisuan成员方法,该方法可以接收一个数n,计算 1+..+n 的结果
④添加add 成员方法,可以计算两个数的和 成员方法的基本语法:
访问修饰符号 function 函数名(参数列表){
//函数体
//return 语句; } <?php
cla Person{
public $name;
public $age;
public function speak(){
echo "我是一个好人!";
}
public function count1(){
$res=0;
for($i=1;$i
$res+=$i;
}
//return 究竟到什么地方去?谁调用,就返回给谁
return $res;
}
//修改jisuan成员方法,该方法可以接收一个数n,计算 1+..+n 的结果
public function count2($n){
$res=0;
for($i=0;$i
$res+=$i;
}
return $res;
}
//添加add 成员方法,可以计算两个数的和
public function add($num1,$num2){
return $num1+$num2;
}
}
//如何使用函数
//1.创建一个人
$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); ?>
成员方法的细节
我们在实际开发,其实通常是这样来使用类
Person.cla.php
cla Person{
//成员属性
public $name;
public $age;
//成员方法
public function speak(){
echo "我是一个好人!";
}
public function count1(){
$res=0;
for($i=1;$i
$res+=$i;
}
//return 究竟到什么地方去?谁调用,就返回给谁
return $res;
}
//修改jisuan成员方法,该方法可以接收一个数n,计算 1+..+n 的结果
public function count2($n){
$res=0;
for($i=0;$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
//这个条件说明,maxVal不是最大
if($maxVal
//调整
$maxVal=$arr[$i];
$maxIndex=$i;
}
}
return $maxVal;
}
}
?>
Exercise01.php
//引入类文件
require_once „Person.cla.php‟;
//创建对象
$p1=new Person();
//调用$p1的各个方法
$p1->speack();
$p1->count1();.. ?>
案例:编写一个函数(以面向对象的方式开发),从网页输入一个整数打印出对应的金子塔:
当我们学习完成员方法后,我们的类定义就完善一步了:
1.设计计算机类,要求如下: 属性:品牌,颜色,cpu型号,内存容量,硬盘大小,价格,工作状态
方法: 打开,关闭,休眠 (表示) 创建一个计算机对象,调用打开,关闭方法.
php面向对象编程
构造方法 cla Person{
public $name;
public $age; }
$p1=new Person(); //再给属性赋值 $p1->name=”宋江”; $p1->age=33;
//需求在创建一个人对象时候,我就初始化 name 和 age;->构造方法 我们快速入门: cla Person{
public $name;
public $age;
public function __construct(){
echo “我是构造方法”;
}
//业务代码要放在成员方法 public function findPerson(){ } }
$p1=new Person(); ☞构造方法没有返回值, 它是自动被调用
2.在php 5 中一个类可以同时有两种形式的构造方法
__construct() 和类名() , 当两个同时存在的时候,优先调用__construct(), 请大家以后使用__construct()
this的理解 cla Person{ public $name; public $age;
//这个就是构造方法,php5独有
public function __construct($iname,$iage){
//$name认为$name是一个新的变量
//$name=$iname;
//$age=$iage;
$this->name=$iname;
$this->age=$iage;
echo "我是构造方法"; } }
$p1=new Person("张清",90); echo "hello-".$p1->name; $p2=new Person("宋江",33); echo "aa-".$p2->name; $this 理解图:
☞ 1.$this 本质可以理解就是这个对象的地址
2.哪个对象使用到$this, 就是哪个对象地址
3.$this不能在类外部使用. 构造方法的注意事项
(1)一旦自定义了一个构造函数,默认的
构造函数就被覆盖了,这时在创建对象的时候就要使用自定义的构造函数.(2)一个类只能有一个构造函数.(不能重载) 构造方法的8点说明:
①构造方法名和类名相同(php4版),php5版的构造方法 名可以和类名相同,也可以是__construct() ②构造方法没有返回值
③主要作用是完成对新对象的初始化,并不是创建对象本身。 ④在创建新对象后,系统自动的调用该类的构造方法
⑤一个类有且只有一个构造方法,在php5后虽然__construct() 和类名() 可以共存,但是实际上也只能使用一个。
⑥如果没有给类自定义构造方法,则该类使用系统默认的构造方法。 cla Cat{
funciton __construt($name){
echo “ok”; }
}
$cat1=new Cat();
⑦如果给类自定义了构造方法,则该类的默认构造方法被覆盖。 ⑧构造方法的默认访问修饰符是public
析构方法
析构方法的作用主要用于,释放资源(比如释放数据库的链接,图片资源...销毁某个对象..) 快速入门 <?php
cla Person{
public $name;
public $age;
public $conn;
//构造方法
public function __construct($name,$age){
$this->name=$name;
$this->age=$age;
//打开一个$conn链接数据库的资源
}
//写一个析构方法 __ 是两个下划线
function __destruct(){
echo $this->name."销毁资源关闭数据库..";
}
}
$p1=new Person("贾宝玉",16);
$p2=new Person("林黛玉",14); ?>
运行代码我们得出: 1.
析构方法会自动调用 2.
析构方法主要用于销毁资源
3.
析构方法调用顺序是,先创建的对象后被销毁 4.
析构方法什么时候被调用 (1) 当程序(进程结束)退出时
(2) 当一个对象称为垃圾对象的时候,该对象的析构方法也会被调用, (3) 所谓垃圾对象,就是指,没有任何变量再引用它.(4) 一旦一个对象成为垃圾对象,析构方法就会立即调用 示意图:
小结:
①php5加入的的析构方法function __destruct() ②析构方法没有返回值
③主要作用是释放资源的操作,并不是销毁对象本身。 ④在销毁对象前,系统自动的调用该类的析构方法
⑤一个类最多只有一个析构方法。
更新时间:2013年01月03日17时03分 来源: 静态变量 提出一个问题:
说,有一群小孩在玩堆雪人,不时有新的小孩加入, 请问如何知道现在共有多少人在玩?请使用面向 对象的思想,编写程序解决。 思路:
1. 使用全局变量
* 什么是全局变量, 在程序中,都可以使用的变量称为全局变量.当我们了解全局变量后,我们来看看如何解决问题? <?php
//定义,完游戏的全局变量
global $global_nums;
//赋值
$global_nums=0;
cla Child{
public $name;
function __construct($name){
$this->name=$name;
}
public function join_game(){
//声明一下使用全局变量
global $global_nums;
$global_nums+=1;
echo $this->name."加入堆雪人游戏";
}
}
//创建三个小孩
$child1=new Child("李逵");
$child1->join_game();
$child2=new Child("张飞");
$child2->join_game();
$child3=new Child("唐僧");
$child3->join_game();
//看看有多少人玩游戏
echo "有".$global_nums; ?>
2.
使用静态变量 静态的变量的基本用法 1.
在类中定义静态变量 [访问修饰符] static $变量名; 2.
如何访问静态变量
如果在类中访问 有两种方法self::$静态变量名 , 类名::$静态变量名 如果在类外访问: 有一种方法类名::$静态变量名 3.静态变量存在方式
解法: cla Child{
public $name;
//这里定义并初始化一个静态变量 $nums
public static $nums=0;
function __construct($name){
$this->name=$name;
}
public function join_game(){
//self::$nums使用静态变量
self::$nums+=1;
echo $this->name."加入堆雪人游戏";
}
}
//创建三个小孩
$child1=new Child("李逵");
$child1->join_game();
$child2=new Child("张飞");
$child2->join_game();
$child3=new Child("唐僧");
$child3->join_game();
//看看有多少人玩游戏
echo "有这".Child::$nums;
静态方法
需求: 当我们操作静态变量的时候,我们可以考虑使用静态方法,比如统计所有学生交的学费
在我们编程中,我们往往使用静态方法去操作静态变量.
静态方法的特点
1.
静态方法去操作静态变量
2.
静态方法不能操作非静态变量.
这里请注意 : 普通的成员方法, 既可以操作非静态变量, 也可以操作静态变量
php面向对象编程的三大特征
①
封装 ②
继承 ③
多态
抽象
cla Account {
public $blance;
public $no;
public function qun(){ } public function cun(){ } }
封装
那么在php中如何实现这种类似的控制呢?请大家看一个小程序.(visit1.php),不能随便查看人的年龄,工资等隐私...
cla Person{
public $name;
private $age;
private $salary;
function __construc($name,$age,$salary){
$this->name=$name;
$this->age=$age;
$this->salary=$salary } }
php提供了三种访问控制符号.
有三种
1. public 表示全局,可以在本类,类外部,子类中使用 2. protected 表示受到保护,可以在本类, 子类中使用 3. private 表示私有, 只能在本类使用
这三个控制修饰符号可以对属性和方法修饰
1.
如果一个方法没有访问修饰符,则默认是public 2.
属性必须指定访问修饰符
☞方法之间可以互相调用.但是需要使用 $this引用 function test11(){
$this->test12();
}
protected function test12(){
echo "test12 hello";
}
举例说明: cla Person{
public $name;
protected $age;
private $salary;
function __construct($name,$age,$salary){
$this->name=$name;
$this->age=$age;
$this->salary=$salary;
}
//成员方法
function showInfo(){
//这里说明在本类中可以使用 public protected 和private 修饰的变量.
echo $this->name."||".$this->age."||".$this->salary;
}
}
//创建一个人
$p1=new Person("孙悟空",30,1000);
echo $p1->name; //可以
echo $p1->age;//报错
echo $p1->salary;//报错.
?我们现在就想去访问protected 变量或者 private 变量, 通常的做法是提供 public 函数去访问这些变量.形式是
public function setXxx($val){ } public function getXxx(){ } public function showInfo(){ }
public protected private 可以修饰属性和方法
(1) 查看薪水 (private ) //获取这个人的薪水
public function getSalary($user,$pa){
if($user=="shunping" && $pa="123"){
return $this->salary;
}else{
return "sorry,你无法看";
}
} (2) 修改人的年龄
提供了两个函数.//修改年龄,对输入的值,进行校验.
public function setAge($age){
if($age>1 && $age
$this->age=$age;
}else {
echo "年龄范围不对";
}
}
//查看年龄
public function getAge(){
return $this->age;
}
还有一种形式, 通过一对 __set 和 __get方法来操作我们的变量,不推荐.cla A{
private $n1;
private $n2;
private $n3;
//使用__set 方法来管理所有的属性
public function __set($pro_name,$pro_val){
$this->pro_name=$pro_val;
}
//使用__get 可以获取所有的属性值
public function __get($pro_name){
if(iet($pro_name)){
return $this->pro_name;
}else{
return null;
}
}
}
$a1=new A();
$a1->n1="hello";
echo $a1->n1;
$a1->n2=890;
echo "||".$a1->n2;
可以直接写一个方法了操作变量 cla Peron{
protected n1;
private $n2;
function showInfo($n1){
$this->n1=$n1;
echo $this->n1.”||”$this->n2; } }
为什么需要继承
//应用场景开发一套学生管理系统(Pupil, Graduate , ...)
//小学生类
cla Pupil{
public $name;
protected $age;
protected $grade;
public function showInfo(){
echo $this->name."||".$this->age;
}
public function tesing(){
echo " 小学生考试..";
}
}
//研究生类
cla Graduate{
public $name;
protected $age;
protected $grade;
public function showInfo(){
echo $this->name."||".$this->age;
}
public function tesing(){
echo "研究生考试..";
}
}
从上面的代码我们看出,代码的复用性不高,同时也会让管理代码成本增高.
解决之道(继承);
现在我们使用继承对上面的代码,进行改写.
代码:
//应用场景开发一套学生管理系统(Pupil, Graduate , ...)
//父类
cla Stu{
public $name;
protected $age;
protected $grade;
public function showInfo(){
echo $this->name;
}
}
//子类
cla Pupil extends Stu{
public function testing(){
echo " 小学生考试..";
}
}
cla Graduate extends Stu{
public function testing(){
echo "研究生考试..";
}
}
//创建学生
$stu1=new Pupil();
$stu1->name="小明";
$stu1->testing();
$stu1->showInfo();
//创建一个研究生
$stu2=new Graduate();
$stu2->name="老明";
$stu2->testing();
$stu2->showInfo();
☞从上面的代码我们可以看出: 所谓继承就是一个子类通过 extends 父类 把父类的 (public / protected)属性和(public / protected)方法继承下来.
继承的基本语法是:
cla 类名 extends 父类名{
//在写自己需要的属性和方法.}
讨论继承细节:
讨论继承细节:
1.
父类的 public、protected 的属性和方法被继承.private 的属性和方法没有被继承.2.
一个类只能继承一个父类,(直接继承).如果你希望继承多个类的属性和方法,则使用多层继承 cla A{
public $n1=90; }
cla B extends A{
public $n2="hello"; }
cla C extends B{
}
$c=new C(); echo $c->n1;
3.
当创建子类对象的时候,默认情况下,不会自动调用父类的构造方法.cla A{
public $n1=90;
//构造方法
public function __construct(){
echo "A __construct";
}
}
cla B extends A{
function __construct(){
echo "B __construct";
}
}
//创建B对象实例
$b=new B();
4.
如果我们希望去调用父类的构造方法,或者其它的方法(public / protected) ,可以这样处理 (了解)
4.1 类名::方法名() 4.2 parent::方法名() 举例
cla A{
public $n1=90;
//构造方法
public function __construct(){
echo "A __construct";
}
}
cla B extends A{
function __construct(){
echo "B __construct";
//显式的调用父类的方法
//A::__construct();
parent::__construct();
} }
//创建B对象实例 $b=new B();
5.当一个子类的方法和父类的方法完全一样(public protected), 我们称为方法的覆盖 (方法重写)
重载
基本概念: 函数名一样,通过函数的参数个数或者是参数类型不同,达到调用同一个函数名,但是可以区分不同的函数 cla A{
public function test1(){
echo “test1”; } public function test1($a){
echo “test1 hello”; } } 重载
$a =new A(); $a->test1(); $a->test1(456); 上面的这用用法是不对.PHP5 中如何通过魔术函数来实现方法重载的效果 代码说明 <?php
cla A{
public function test1($p){
echo "接收一个参数";
echo "接收到参数是";
var_dump($p);
}
public function test2($p){
echo "接收两个参数";
var_dump($p);
}
//这些提供一个__call
//__call 是它一个对象调用某个方法,而该方法不存在,则
//系统会自动调用__call
function __call($method,$p){
var_dump($p);
if($method=="test"){
if(count($p)==1){
$this->test1($p);
}else if(count($p)==2){
$this->test2($p);
}
}
}
}
$a=new A();
$a->test(1);
$a->test(56,90);
?> 小结: 关于重载
① php5 默认情况下不直接支持方法重载 ② php5 可以同__call魔术方法,模拟一个方法效果的效果
方法的重写/方法的覆盖(override) ①
先看一个问题
当一个父类知道所有的子类都有一个方法,但是父类不能确定该方法究竟如何写,可以让子类去覆盖这个方法,具体用法如下: <?php
//抽象一个Animal类
cla Animal{
public $name;
protected $price;
function cry(){
echo "不知道动物怎么叫..";
}
}
cla Dog extends Animal{
//覆盖
function cry(){
echo "小狗汪汪叫..";
}
}
cla Pig extends Animal{
//覆盖.
function cry(){
echo "哼哼叫..";
}
}
//创建一个只狗
$dog1=new Dog();
$dog1->cry();
$pig1=new Pig();
$pig1->cry(); ?> 关于方法重写细节讨论
1.
要实现重写,要求子类的那个方法的名字和参数列表个数一摸一样,但是并不要求参数的名称一样.2.
如果子类要去调用父类的某个方法(public / protected) 则可以使用 parent::方法名(参数..) , 父类名::方法名(参数...) 3.
在实现方法覆盖的时候,访问修饰符可以不一样
//但是必须满足: 子类的访问范围>=父类的访问范围 多态体现在什么地方? cla Animal{
public function cry(){
echo '动物叫唤..';
}
}
cla Cat extends Animal{
public function cry(){
echo "abc";
}
}
$cat1=new Cat();
$cat1->cry(); 当子类没有覆盖父类的方法则 $cat1->cry() 调用的是父类,当子类覆盖了父类的方法,则调用自己的cry()
抽象类
为什么设计抽象类这个技术?
1. 在实际开发中,我们可能有这样一种类,是其它类的父类,但是它本身并不需要实例化,主要用途是用于让子类来继承,这样可以到达代码复用.同时利于项目设计者,设计类.快速入门
//在实现方法覆盖的时候,访问修饰符可以不一样
//但是必须满足: 子类的访问范围>=父类的访问范围
abstract cla Animal{
public $name;
protected $age;
//这个方法没有方法体,这个方法主要是为了让子类去实现.
abstract public function cry();
}
cla Cat extends Animal{
public function cry(){
echo "猫猫叫唤..";
}
}
//创建一个子类实例
$cat1=new Cat();
$cat1->cry(); 使用抽象类的注意事项: 1.
基本用法 abstract cla 类名{
//方法
//属性 }
2.
如果一个类使用abstract 来修饰,则该类就是抽象类, 如果一个方法被abstract修饰,则该方法就是抽象方法【抽象方法就不能有方法体.】
3.
抽象类可以没有抽象方法.同时还可以有实现了的方法.<?php
//在实现方法覆盖的时候,访问修饰符可以不一样
//但是必须满足: 子类的访问范围>=父类的访问范围
abstract cla Animal{
public $name="abc";
protected $age;
//这个方法没有方法体,这个方法主要是为了让子类去实现.
abstract public function cry();
public function getName(){
return $this->name;
}
}
cla Cat extends Animal{
public function cry(){
echo "猫猫叫唤..";
}
}
//创建一个子类实例
$cat1=new Cat();
$cat1->cry();
echo $cat1->getName();
?>
4.
如果一个类中,只要有抽象方法,则该类必须声明为abstract abstract cla A{
abstract function test();
}
echo "ok";
5.
如果A类继承了一个抽象类 B,则要求A类实现从B类继承的所有抽象方法 案例:
//这是一个抽象类
abstract cla A{
abstract function test();
}
//B类要么自己抽象,或者实现从A类继承的抽象方法.
cla B extends A{
function test(){
echo "我实现A:test()";
}
}
echo "hello"
接口 快速入门: <?php
//使用程序模拟现实情况
//定义规范(方法/属性)
interfaceiUsb{
public function start();
public function stop();
}
//编写相机类,让它去实现接口
//1.当一个类实现了某个接口,则要求该类必须实现这个接口的所有方法
cla Camera implements iUsb{
public function start(){
echo "相机开始工作";
}
public function stop(){
echo "相机停止工作...";
}
}
//编写手机类
cla Phone implements iUsb{
public function start(){
echo "手机开始工作";
}
public function stop(){
echo "手机停止工作...";
}
}
//如何使用
$camera1=new Camera();
$camera1->start();
$camera1->stop();
echo "";
//手机对象
$phone1=new Phone();
$phone1->start();
$phone1->stop(); ?>
1. 接口的使用基本语法 interface 接口名{
//属性
//方法 }
接口的方法都不能有方法体 如何去实现接口
cla 类名 implements 接口名1,接口2.{ }
接口它的作用就是声明一些方法,供其它类来实现.接口还体现编程中我们希望的效果高内聚低耦合的特点:
继承是实现接口的关系一览图
深入讨论接口-interface 什么情况下可以考虑使用接口 1.
定规范
2.
定下规范,让别的程序员来实现,比如: //韩是项目经理
//学生管理系统 (students)
//定义接口
interfaceStuManageInterface{
public function addStudent($stu);
public function delStudent($id);
public function updStudent($stu);
}
//给三
claStuManage {
public function tianjiaxuesheng(){
}
}
//四
3.
当多个类,他们之间是平级的关系.这些类都会去实现某个功能,只是实现的方式不一样.
接口的细节
1.
不能去实例化一个接口 interfaceiUsb{ }
$a=new iUsb(); (错误!!!)
2.
接口中的所有方法,都不能有方法体 3.
一个类可以去实现多个接口 语法:
cla 类名 implements 接口1,接口2{ }
4.
接口中可以有属性,但是必须是常量,并且是public interfaceiUsb{
const A=90;
}
echo "ok".iUsb::A;
5.
接口的方法是public 【默认就是public 】 ,不能是 protected 和private 举例: interfaceiUsb{
const A=90;
function test();
}
echo "ok".iUsb::A; 6. 类和接口之间关系一览图
代码: <?php
interface iUsb2{
public function a();
}
interface iUsb3{
public function b();
}
interfaceiUsb extends iUsb2,iUsb3{
const A=90;
function test();
}
cla Cla1 implements iUsb{
public function a(){
}
public function b(){
}
public function test(){
}
}
echo "ok".iUsb::A; ?>
从上面我们看出 ① 一个接口可以继承多个其它的接口.
当一个类去实现了某些接口,则必须把所有接口的方法,都实现
继承和实现接口的比较: (1) 可以认为实现接口是对单一继承的补充.(2) 可以在不破坏类层级关系的前提下,对某个类功能扩展.
final关键字
1.
如果我们希望某个类不被其它的类来继承(可能因为安全考虑...), 可以使用final <?php
final cla A{
}
cla B extends A{
}
echo "ok"; ?> 2.
如果我们希望某个方法,比如计算个人所得税的方法,不能子类改写,可以使用fianl来修饰方法 cla A{
final public function getRate($salary){
return $salary*0.08;
}
}
cla B extends A{
//不能去覆盖父类的getRate方法.
/*public function getRate($sal){
return $sal*0.01;
}*/
}
$b=new B();
echo $b->getRate(100); 3. final关键字不能去修饰属性.
const关键字的讲解
//当你有一个属性,不希望被修改,则考虑使用const做成常量 基本用法是 cla A{
const常量名=赋初值; } interface 接口名{
const常量名=赋初值; } 常量是public
使用类名::常量名; 接口名::常量 <?php
cla A{
//常量在定义的时候,必须给初值.
//const关键字前面不要带修饰符号.
const TAX_RATE=0.08;
public function payTax($val){
//常量不能修改.
//A::TAX_RATE=0.01;
//return $val*self::TAX_RATE; 【ok】
return $val*A::TAX_RATE; //【ok】
}
}
$a=new A();
echo $a->payTax(200); ?> 1.
常量在定义的时候需要赋初值 2.
常量不能修改.3.
常量名不能有 $, 一般是大写, 默认是public
4.
常量在类的内部使用 self::常量的名称类名::常量的名称 在类的外部使用类名::常量的名称.面向对象编程的综合案例
现在我们一起来完成一个稍微综合的案例---php版本的计算器,从而加深对php的认识,为下一步学习做准备。先用两个页面来完该计算器: myCal.php(界面) myResult.php(计算) 知识点:
1.如何接收php页面提交的数据,并处理
2.php中如何使用javascript完成对数据合法性的校验
我们一起来开发.5.
画出程序框架图: 6.
编写代码: 现在我们分析如果要求把 xml 的作业改成面向对象的方式.怎么该?
传智播客 韩顺平轻松搞定网页设计(html+c+javascript) 之javascript
人人范文网 m.inrrp.com.cn 手机版