PHP中类与对象功能、用法实例解读


Posted in PHP onMarch 27, 2020

本文实例讲述了PHP中类与对象功能、用法。分享给大家供大家参考,具体如下:

1. 类与对象

类是面向对象程序设计的基本概念,是一类东西的结构描述 , 是一种抽象的概念 . 对象是一类东西的一个具体的实例 , 是具体事物 .

对象通过new关键字进行实例化:
比如汽车可以抽象为一个类,汽车拥有名字、轮胎、速度、重量等属性,可以有换挡、前进、后退等操作方法。

// 定义一个汽车类
class Car {
  $name = '汽车';
  function getName() {
    return $this->name;
  }
}
//对象通过new关键字进行实例化 
$car = new Car();
echo $car->getName();
2. 属性与对象

在类中定义的变量称之为属性。属性声明是由关键字 public,protected 或者 private 开头,后面跟一个普通的变量声明来组成。属性的变量可以设置初始化的默认值,默认值必须是常量。

方法就是在类中的function,很多时候我们分不清方法与函数有什么差别,在面向过程的程序设计中function叫做函数,在面向对象中function则被称之为方法。

访问控制的关键字代表的意义为:

  • public:公开的 , 任何地方都可以访问
  • protected:受保护的 , 类内自身 , 其子类和父类可以访问
  • private:私有的 , 类内自身可访问

类属性的访问控制必须定义 , 即必须写出关键字 , 定义为三个中的一个
类方法不写关键字 , 则默认为公有的

class Car {
  public $speed = 0;
  //增加speedUp方法,使speed加10
  public function speedUp(){
    $this->speed += 10;
  }
}
// 创建对象
$car = new Car();
// 通过对象获取类属性与类方法
$car->speedUp();
echo $car->speed;
3. 构造函数与析构函数

PHP5可以在类中使用__construct()定义一个构造函数,具有构造函数的类,会在每次对象创建的时候调用该函数,因此常用来在对象创建的时候进行一些初始化工作。

在子类中如果定义了__construct则不会调用父类的__construct,如果需要同时调用父类的构造函数,需要使用parent::__construct()显式的调用。

同样,PHP5支持析构函数,使用__destruct()进行定义,析构函数指的是当某个对象的所有引用被删除,或者对象被显式的销毁时会执行的函数。

class Car {
  function __construct() {
    print "构造函数被调用 \n";
  }
  function __destruct() {
    print "析构函数被调用 \n";
  }
}
$car = new Car(); //实例化时会调用构造函数
echo '使用后,准备销毁car对象 \n';
unset($car); //销毁时会调用析构函数

当PHP代码执行完毕以后,会自动回收与销毁对象,因此一般情况下不需要显式的去销毁对象。

4. 静态属性与静态方法
  • 静态属性:
public / protected / private static $变量名

不用实例化类 , 直接调用 类名 :: $变量名
但实例化后 , 不允许使用 对象 -> $变量名

  • 静态方法
public / protected / private static function 方法名()

不用实例化类 , 直接调用 类名 :: 方法名()
实例化后 , 对象 -> 方法名()
静态方法中,$this伪变量不允许使用。可以使用self,parent,static在内部调用静态方法与属性。

class Car {
  private static $speed = 10;
  
  public static function getSpeed() {
    return self::$speed;
  }
  
  public static function speedUp() {
    return self::$speed+=10;
  }
}
class BigCar extends Car {
  public static function start() {
    parent::speedUp();
  }
}

BigCar::start();
echo BigCar::getSpeed();

如果构造函数定义成了私有方法,则不允许直接实例化对象了,这时候一般通过静态方法进行实例化,在设计模式中会经常使用这样的方法来控制对象的创建,比如单例模式只允许有一个全局唯一的对象。

class Car {
  private function __construct() {
    echo 'object create';
  }

  private static $_object = null;
  public static function getInstance() {
    if (empty(self::$_object)) {
      self::$_object = new Car(); //内部方法可以调用私有方法,因此这里可以创建对象
    }
    return self::$_object;
  }
}
$car = new Car(); //这里不允许直接实例化对象
$car = Car::getInstance(); //通过静态方法来获得一个实例
5. 继承

继承是面向对象程序设计中常用的一个特性,汽车是一个比较大的类,我们也可以称之为基类,除此之外,汽车还分为卡车、轿车、东风、宝马等,因为这些子类具有很多相同的属性和方法,可以采用继承汽车类来共享这些属性与方法,实现代码的复用。

class Car {
  public $speed = 0; //汽车的起始速度是0
  
  public function speedUp() {
    $this->speed += 10;
    return $this->speed;
  }
}
//建立一个Truck类,扩展Car类,并覆盖speedUp方法,使速度累加50
class Truck extends Car{
  public function speedUp(){
    parent::speedUp();
    $this->speed += 50;
    return $this->speed;
  }
}

$car = new Truck();
$car->speedUp();
echo $car->speed;
5. 重载

PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的。

  • 属性的重载通过__set,__get,__isset,__unset来分别实现对不存在属性的赋值、读取、判断属性是否设置、销毁属性。
class Car {
  private $ary = array();
  
  public function __set($key, $val) {
    $this->ary[$key] = $val;
  }
  
  public function __get($key) {
    if (isset($this->ary[$key])) {
      return $this->ary[$key];
    }
    return null;
  }
  
  public function __isset($key) {
    if (isset($this->ary[$key])) {
      return true;
    }
    return false;
  }
  
  public function __unset($key) {
    unset($this->ary[$key]);
  }
}
$car = new Car();
$car->name = '汽车'; //name属性动态创建并赋值
echo $car->name;
if ($car->age){
  echo '有';
}else{
  echo '无';
}
unset($car->name);
var_dump($car->name);
  • 方法的重载通过__call来实现,当调用不存在的方法的时候,将会转为参数调用__call方法,当调用不存在的静态方法时会使用__callStatic重载。
class Car {
  public $speed = 0;
  
  public function __call($name, $args) {
    if ($name == 'speedUp') {
      $this->speed += 10;
    }
  }
}
$car = new Car();
$car->speedUp(); //调用不存在的方法会使用重载
echo $car->speed;
6. 高级特性

对象比较,当同一个类的两个实例的所有属性都相等时,可以使用比较运算符 == 进行判断,当需要判断两个变量是否为同一个对象的引用时,可以使用全等运算符 === 进行判断。

class Car {
}
$a = new Car();
$b = new Car();
if ($a == $b) echo '==';  //true
if ($a === $b) echo '==='; //false

对象复制,在一些特殊情况下,可以通过关键字clone来复制一个对象,这时__clone方法会被调用,通过这个魔术方法来设置属性的值。

class Car {
  public $name = 'car';
  
  public function __clone() {
    $obj = new Car();
    $obj->name = $this->name;
  }
}
$a = new Car();
$a->name = 'new car';
$b = clone $a;
var_dump($b);

对象序列化,可以通过serialize方法将对象序列化为字符串,用于存储或者传递数据,然后在需要的时候通过unserialize将字符串反序列化成对象进行使用。

class Car {
  public $name = 'car';
}
$a = new Car();
$str = serialize($a); //对象序列化成字符串
echo $str.'<br>';
$b = unserialize($str); //反序列化为对象
var_dump($b);

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP 字符串操作入门教程
Dec 06 PHP
php 什么是PEAR?(第二篇)
Mar 19 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
Dec 10 PHP
PHP JS Ip地址及域名格式检测代码
Sep 27 PHP
PHP代码优化的53个细节
Mar 03 PHP
ThinkPHP实现二级循环读取的方法
Nov 03 PHP
PHP封装CURL扩展类实例
Jul 28 PHP
wampserver改变默认网站目录的办法
Aug 05 PHP
PHP新建类问题分析及解决思路
Nov 19 PHP
Zend Framework入门应用实例详解
Dec 11 PHP
PHP的静态方法与普通方法用法实例分析
Sep 26 PHP
PHP实现单条sql执行多个数据的insert语句方法
Oct 11 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 #PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 #PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
Mar 26 #PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 #PHP
Centos7安装swoole扩展操作示例
Mar 26 #PHP
PHP开发api接口安全验证操作实例详解
Mar 26 #PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 #PHP
You might like
php通过Chianz.com获取IP地址与地区的方法
2015/01/14 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
用javascript对一个json数组深度赋值示例
2014/07/27 Javascript
JavaScript动态修改网页元素内容的方法
2015/03/21 Javascript
javascript关于运动的各种问题经典总结
2015/04/27 Javascript
jquery实现顶部向右伸缩的导航区域代码
2015/09/02 Javascript
JavaScript类型系统之基本数据类型与包装类型
2016/01/06 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
2016/06/21 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
Angular CLI在Angular项目中如何使用scss详解
2018/04/10 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
Python之eval()函数危险性浅析
2014/07/03 Python
Python的Flask框架中Flask-Admin库的简单入门指引
2015/04/07 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
2017/10/16 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
python实现猜数字小游戏
2020/03/24 Python
python实现QQ邮箱/163邮箱的邮件发送
2019/01/22 Python
Python Matplotlib简易教程(小白教程)
2020/07/28 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
Delphi CS笔试题
2014/01/04 面试题
校庆口号
2014/06/20 职场文书
车辆委托书范本
2014/10/05 职场文书
标准离婚协议书范文下载
2014/11/30 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
初中开学典礼新闻稿
2015/07/17 职场文书
python获取淘宝服务器时间的代码示例
2021/04/22 Python
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers