PHP面向对象(1)
一、基础
1、概念:
类:类是具有相同属性和行为的事物的描述。对象是类的一个实例。
2.对象的特征
属性和行为
3、面向对象实质
面向对象就是把生活中要解决的问题都用对象的方式进行存储(属性和方法)。
4、面向对象的基本思路
a:识别对象
任何实体都可以被识别为一个对象。
b:识别对象的属性
--对象里面存储的数据被识别为属性。
--对于不同的业务逻辑,关注的数据不同,对象里面存储的属性也不同。
c、识别对象的行为
--对象自己属性数据的改变
--对象和外部交互
5、面向对象的基本原则
a、对象内部是高内聚的
--对象只负责一项特定的职能(职能可大可小)
--所有对象相关的内容都封装到对象内部
6、对象对外是低耦合的
--外部世界可以看到对象的一些属性(并非全部)
--外部世界可以看到对象可以做某些事情(并非全部)
7、类的实例化
--创建一个类的对象
代码:
--如何定义一个类
--如何实例化类的对象
--如何调用类的方法
--构造函数
--析构函数
1 <?php 2 class NbaPlayer{ 3 public $name = "Jordan"; 4 public $height = "198cm"; 5 public $weight = "98kg"; 6 public $team = "Bull"; 7 public $playerNumber = "23"; 8 //定义方法 9 public function run(){ 10 echo "Running\n"; 11 } 12 public function jump(){ 13 echo "Jumping\n"; 14 } 15 //运球 16 public function dribble(){ 17 echo "Dribbling\n"; 18 } 19 //投篮 20 public function shoot(){ 21 echo "Shooting\n"; 22 } 23 //扣篮 24 public function dunk(){ 25 echo "Dunking\n"; 26 } 27 public function pass(){ 28 echo "Passing\n"; 29 } 30 } 31 //类到对象的实例化 32 //类实例化为对象时使用关键字new,new之后紧跟类的名称和一对括号 33 $jordan = new NbaPlayer(); 34 //对象中的属性成员可以通过->符号来访问 35 echo $jordan->name."<br/>";
36 $jordan->dribble();
37 $jordan->pass();
运行效果:
加上构造方法:
function __construct(){
echo "IN NbaPlayer Construct"."<br/>";
}
运行效果:
IN NbaPlayer Construct
Jordan 198cm
Dribbling Passing
加上析构方法:
function __destruct(){
echo "析构函数被调用";
}
运行效果:
IN NbaPlayer Construct
Jordan 198cm
Dribbling Passing 析构函数被调用
带参数的构造函数:
1 <?php 2 class NbaPlayer{ 3 public $name = "Jordan"; 4 public $height = "198cm"; 5 public $weight = "98kg"; 6 public $team = "Bull"; 7 public $playerNumber = "23"; 8 9 function __construct($name,$height,$weight,$team,$playNumber){ 10 $this->name = $name; 11 $this->height = $height; 12 $this->weight = $weight; 13 $this->team = $team; 14 $this->playNumber = $playNumber; 15 16 } 17 function __destruct(){ 18 echo "析构函数被调用"; 19 } 20 21 //定义方法 22 public function run(){ 23 echo "Running\n"; 24 } 25 public function jump(){ 26 echo "Jumping\n"; 27 } 28 //运球 29 public function dribble(){ 30 echo "Dribbling\n"; 31 } 32 //投篮 33 public function shoot(){ 34 echo "Shooting\n"; 35 } 36 //扣篮 37 public function dunk(){ 38 echo "Dunking\n"; 39 } 40 public function pass(){ 41 echo "Passing\n"; 42 } 43 } 44 //类到对象的实例化 45 //类实例化为对象时使用关键字new,new之后紧跟类的名称和一对括号 46 $jordan = new NbaPlayer("jordan","198cm","98kg","Bull","23"); 47 48 //对象中的属性成员可以通过->符号来访问 49 echo $jordan->name."\n"; 50 echo $jordan->height."<br/>"; 51 $jordan->dribble(); 52 echo "<br/>"; 53 $jordan->pass(); 54 echo "<br/>"; 55 $james = new NbaPlayer("James","203cm","120kg","Heat","6"); 56 echo $james->name."<br/>";
运行效果:
jordan 198cm
Dribbling
Passing
James
析构函数被调用析构函数被调用
二、面向对象继承
继承好处:
--父类里面定义的类成员可以不用在子类中重复定义,节约了编程的时间和代价。
比如,人的吃这个方法一旦在父类中定义,那么NBA球员和女主播两个子类就
不需要实现吃这个方法了,就好像天生就有这个功能一样
--同一个父类的子类拥有相同的父类定义的类成员,因此外部代码调用它们的时候可以
一视同仁
比如,一个NBA球员和一个女主播,因为他们都是人,所以可以直接调用父类定义的
“吃”方法,而不用管他(她)到底是个NBA球员还是女主播
--子类可以修改和调整父类定义的类成员
我们称为重写(overwrite),一旦子类修改了,就按照子类修改之后的功能执行。
代码:
1 <?php 2 3 4 class Human{ 5 public $name; 6 public $height; 7 public $weight; 8 9 public function eat($food){ 10 echo $this->name." is eating ".$food."<br/>"; 11 } 12 } 13 //单继承 14 class NbaPlayer extends Human{ 15 16 public $team = "Bull"; 17 public $playerNumber = "23"; 18 19 function __construct($name,$height,$weight,$team,$playNumber){ 20 $this->name = $name;//父类中的属性可以用this来访问 21 $this->height = $height; 22 $this->weight = $weight; 23 $this->team = $team; 24 $this->playNumber = $playNumber; 25 26 } 27 function __destruct(){ 28 echo "析构函数被调用"; 29 } 30 31 //定义方法 32 public function run(){ 33 echo "Running\n"; 34 } 35 public function jump(){ 36 echo "Jumping\n"; 37 } 38 //运球 39 public function dribble(){ 40 echo "Dribbling\n"; 41 } 42 //投篮 43 public function shoot(){ 44 echo "Shooting\n"; 45 } 46 //扣篮 47 public function dunk(){ 48 echo "Dunking\n"; 49 } 50 public function pass(){ 51 echo "Passing\n"; 52 } 53 } 54 //类到对象的实例化 55 //类实例化为对象时使用关键字new,new之后紧跟类的名称和一对括号 56 $jordan = new NbaPlayer("jordan","198cm","98kg","Bull","23"); 57 58 echo $jordan->name.'<br/>'; 59 $jordan->eat("Apple");
运行效果:
jordan
jordan is eating Apple
析构函数被调用