PHP面向对象之对象的示例分析
创始人
2024-12-11 05:09:58
0次

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

对象的主要三个特性

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

面向对象模型

面向对象的概念:

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

1、PHP面向对象(三)

四、OOP的高级实践

4.3 Static-静态成员

name."'s eating ".$food."
";  } } 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
";  } public function jump(){  echo "Jumping
";  }  public function dribble(){  echo "Dribbling
";  }  public function shoot(){  echo "Shooting
";  }  public function dunk(){  echo "Dunking
";  }  public function pass(){  echo "Passing
";  }  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 "
"; $james=new NbaPlayer("James", "203cm", "120kg", "Heat", "6");echo "
"; // 访问对象的属性使用的语法是->符号,后面跟着属性的名称 echo $jordan->name."
"; // 调用对象的某个方法使用的语法是->符号,后面跟着方法的名称和一对括号 $jordan->run(); $jordan->pass(); //子类调用父类的方法 $jordan->eat("apple"); //试着调用private,直接以及通过内部的public函数 //$jordan->age; $jordan->getAge();echo "
"; $jordan->changePresident("Adam Silver"); echo $jordan->president."
"; echo $james->president."
";  直接从上述例子开始吧。 这里想得到的是,把两位对象的某一个变量同时变掉。——用static public static $president="David Stern";  // 类的方法的定义 public static function changePresident($newP){ static::$president=$newP;//这里static换成self更符合规范 }

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

调用的方法也有所变动。

echo NbaPlayer::$president;echo "
"; NbaPlayer::changePresident("Adam Silver"); echo NbaPlayer::$president;echo "
";

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

内部调用要用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版本

举个例子

class BaseClass{
 public function test(){
 echo "BaseClass::test called
";  } public function test1(){  echo "BaseClass::test1 called
";  } } class ChildClass extends BaseClass{  public function test(){  echo "ChildClass::test called
";  } } $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);
}

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

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

//具体对象,连接到接口
class Human implements ICanEat{
public function eat($food){
 echo "Human eating ".$food.".
";  } } $obj=new Human(); $obj->eat("shit");

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

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

继续

interface ICanEat{
 public function eat($food);
}
//具体对象,连接到接口
class Human implements ICanEat{
public function eat($food){
 echo "Human eating ".$food.".
";  } } class Animal implements ICanEat{  public function eat($food){  echo "Animal eating ".$food.".
";  } } $obj=new Human(); $obj->eat("shit"); $monkey=new Animal(); $monkey->eat("banana");

 让动物也吃起来!

--逆向操作

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

复制代码 代码如下:


var_dump($obj instanceof ICanEat);

会返回boolean值。

--更多的栗子

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、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...