gpt4 book ai didi

PHP面向对象详解(三)

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章PHP面向对象详解(三)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

面向对象 对象概念是面向对象技术的核心。在显示世界里我们所面对的事情都是对象,如计算机、电视机、自行车等。在面向对象的程序设计中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象. 。

对象的主要三个特性 。

对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为。 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型。 对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同.

面向对象模型 。

面向对象的概念:

oop(面向对象的编程)它能是其代码更加简洁易于维护并且具有更强的可重性 。

1、PHP面向对象(三) 。

4、OOP的高级实践 。

4.3 Static-静态成员 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php
date_default_timezone_set( "PRC" );
/**
  * 1. 类的定义以class关键字开始,后面跟着这个类的名称。类的名称命名通常每个单词的第一个字母大写。
  * 2. 定义类的属性
  * 3. 定义类的方法
  * 4. 实例化类的对象
  * 5. 使用对象的属性和方法
  */
class Human{
  public $name ;
  public $height ;
  public $weight ;
public function eat( $food ){
  echo $this ->name. "'s eating " . $food . "<br/>" ;
  }
}
class Animal{
  public $kind ;
  public $gender ;
}
class NbaPlayer extends Human{
  // 类的属性的定义
public $name = "Jordan" ; // 定义属性
public $height = "198cm" ;
  public $weight = "98kg" ;
  public $team = "Bull" ;
  public $playerNumber = "23" ;
  private $age = "44" ;
  public $president = "David Stern" ;
  // 类的方法的定义
public function changePresident( $newP ){
  $this ->president= $newP ;
  }
  public function run() {
  echo "Running<br/>" ;
  }
public function jump(){
  echo "Jumping<br/>" ;
  }
  public function dribble(){
  echo "Dribbling<br/>" ;
  }
  public function shoot(){
  echo "Shooting<br/>" ;
  }
  public function dunk(){
  echo "Dunking<br/>" ;
  }
  public function pass(){
  echo "Passing<br/>" ;
  }
  public function getAge(){
  echo $this ->name. "'s age is " . $this ->age;
  }
  function __construct( $name , $height , $weight , $team , $playerNumber ){
  print $name . ";" . $height . ";" . $weight . ";" . $team . ";" . $playerNumber . "\n" ;
  $this ->name = $name ; // $this是php里面的伪变量,表示对象自身
$this ->height = $height ; // 通过$this可以设置对象的属性值
$this ->weight = $weight ;
  $this ->team = $team ;
  $this ->playerNumber = $playerNumber ;
  }
}
/**
  * 1. 类实例化为对象时使用new关键字,new之后紧跟类的名称和一对括号。
  * 2. 使用对象可以像使用其他值一样进行赋值操作
  */
$jordan = new NbaPlayer( "Jordan" , "198cm" , "98kg" , "Bull" , "23" ); echo "<br/>" ;
$james = new NbaPlayer( "James" , "203cm" , "120kg" , "Heat" , "6" ); echo "<br/>" ;
// 访问对象的属性使用的语法是->符号,后面跟着属性的名称
echo $jordan ->name. "<br/>" ;
// 调用对象的某个方法使用的语法是->符号,后面跟着方法的名称和一对括号
$jordan ->run();
$jordan ->pass();
//子类调用父类的方法
$jordan ->eat( "apple" );
//试着调用private,直接以及通过内部的public函数
//$jordan->age;
$jordan ->getAge(); echo "<br/>" ;
$jordan ->changePresident( "Adam Silver" );
echo $jordan ->president. "<br/>" ;
echo $james ->president. "<br/>" ;
  直接从上述例子开始吧。
这里想得到的是,把两位对象的某一个变量同时变掉。——用 static
public static $president = "David Stern" ;
  // 类的方法的定义
public static function changePresident( $newP ){
static :: $president = $newP ; //这里static换成self更符合规范
}

注意这里static的位置,以及,方法内的:

调用的方法也有所变动.

?
1
2
3
echo NbaPlayer:: $president ; echo "<br/>" ;
NbaPlayer::changePresident( "Adam Silver" );
echo NbaPlayer:: $president ; echo "<br/>" ;

也就是像之前说的,静态成员就是个常量,所以不针对某个具体的对象(不受具体对象的约束)——基于此,定义&赋值&调用都不需要具体的对象参与.

内部调用要用self/static::$... 。

外部调用,类名:

用处就是所有的对象共用的数据.

--如果内部调用时,变量在父类中 。

比如说,在上述例子中,父类human中写这么一句话 。

public static $aaa="dafdfa",

 然后在子类nbaplayer中,调用父类的静态成员时,要 。

echo parent::$aaa,

而外部调用,按照上面说的,类名::,所以,直接父类类名即可 。

echo Human::$aaa,

--其他 。

在静态方法中,是无法访问其他变量的,也就是说,不能用$this-> 。

--小结 。

/**  * 静态成员  * 1. 静态属性用于保存类的公有数据  * 2. 静态方法里面只能访问静态属性  * 3. 静态成员不需要实例化对象就可以访问  * 4. 类内部,可以通过self或者static关键字访问自身的静态成员  * 5. 可以通过parent关键字访问父类的静态成员  * 6. 可以通过类名称在外部访问类的静态成员  */ 。

4.4 Final成员 。

--问题 。

不希望某个类拥有子类; 。

不希望子类修改父类中的某个变量(避免重写?) 。

--final 。

》=php5版本 。

举个例子 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class BaseClass{
  public function test(){
  echo "BaseClass::test called<br/>" ;
  }
public function test1(){
  echo "BaseClass::test1 called<br/>" ;
  }
}
class ChildClass extends BaseClass{
  public function test(){
  echo "ChildClass::test called<br/>" ;
  }
}
$obj = new ChildClass();
$obj ->test();

 子类中编写跟父类中完全一致的方法名(内容可以不同),会完成对父类方法的重写! 。

所以,不希望被重写的父类中的方法,写上final 。

  。

复制代码 代码如下:

final public function test(){

  。

依此类推,对于不想有子类的父类,在类名那里写上final 。

  。

复制代码 代码如下:

final class BaseClass{

  。

--小结 。

/**  * 重写和Final  * 1. 子类中编写跟父类完全一致的方法可以完成对父类方法的重写  * 2. 对于不想被任何类继承的类可以在class之前添加final关键字  * 3. 对于不想被子类重写(overwrite, 修改)的方法,可以在方法定义前面添加final关键字  */ 。

4.5 数据访问 。

先把final都去掉 。

--parent 。

然后再子类中的方法中写 。

parent::test(),

运行后会发现,依然可以通过parent的关键字调用父类中,即使是被重写的数据 。

--self 。

然后在父类中的方法test中写 。

self::test1(),

运行后,发现self可以调用同一个类中的数据(其他方法/静态变量/常量const) 。

--小结 。

/**  * 数据访问补充  * 1. parent关键字可以用于调用父类被重写的类成员  * 2. self关键字可以用于访问类自身的成员方法,也可以用于访问自身的静态成员和类常量;不能用于访问类自身的属性;访问类常量时不用在常量名称前面加$符号  * 3. static关键字用于访问类自身定义的静态成员,访问静态属性时需要在属性名前面添加$符号  */ 。

4.6 对象接口 。

非常重要!!! 。

--问题 。

不同的类,有着相同的行为,但相同的行为又有着不同的实现方法.

比如人和动物都会吃东西,但吃的方式方法又不太一样.

--定义 。

接口就是把不同类的共同行为进行了定义,然后在不同的类里面实现不同的功能.

--栗子  。

  。

复制代码 代码如下:

//定义一个接口
interface ICanEat{
 public function eat($food);
}

  。

可以看到,接口中并没有方法的具体实现,但必须有方法! 。

那么,下面是,“人类会吃” 。

?
1
2
3
4
5
6
7
8
//具体对象,连接到接口
class Human implements ICanEat{
public function eat( $food ){
  echo "Human eating " . $food . ".<br/>" ;
  }
}
$obj = new Human();
$obj ->eat( "shit" );

请忽略我给出的“食物”.

注意,不再用extends,而是implements。然后,同样是方法名的完全相同。然后,对象必须/最好实现方法.

继续 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
interface ICanEat{
  public function eat( $food );
}
//具体对象,连接到接口
class Human implements ICanEat{
public function eat( $food ){
  echo "Human eating " . $food . ".<br/>" ;
  }
}
class Animal implements ICanEat{
  public function eat( $food ){
  echo "Animal eating " . $food . ".<br/>" ;
  }
}
$obj = new Human();
$obj ->eat( "shit" );
$monkey = new Animal();
$monkey ->eat( "banana" );

 让动物也吃起来! 。

--逆向操作 。

判断某个对象是否连接了某个接口.

  。

复制代码 代码如下:

var_dump($obj instanceof ICanEat);

  。

会返回boolean值.

--更多的栗子 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
interface ICanPee extends ICanEat{
  public function pee();
}
class Demon implements ICanPee{
  public function pee(){
  echo "Can demon pee?" ;
  }
  public function eat( $food ){
  echo "Can demon eat " . $food ;
  }
}
$ghost = new Demon();
$ghost ->pee();
$ghost ->eat( "shit" );

 接口本质上也是类,可以被继承/继承,但是使用继承接口的接口,所有父类、“爷类”的方法都要有具体实现.

--小结 。

/**  * 接口  * 1. 接口的基本概念和基本使用方法  * 2. 接口里面的方法没有具体的实现  * 3. 实现了某个接口的类必须提供接口中定义的方法  * 4. 不能用接口创建对象,但是能够判断某个对象是否实现了某个接口  * 5. 接口可以继承接口(interface extends interface)  * 6. 接口中定义的所有方法都必须是公有,这是接口的特性。  */ 。

aaaaaaaaaaaaaa 。

bu xiang xie le.................... 。

ming tian yao ge .............. 。

以上内容是小编给大家介绍的PHP面向对象详解(三),希望大家喜欢.

最后此篇关于PHP面向对象详解(三)的文章就讲到这里了,如果你想了解更多关于PHP面向对象详解(三)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com