PHP面向对象学习之parent::关键字


Posted in PHP onJanuary 18, 2017

前言

最近在做THINKPHP开发项目中,用到了 parent:: 关键字,实际上 parent::关键字 是PHP中常要用到的一个功能,这不仅仅是在 THINKPHP 项目开发中,即使是一个小型的企业站点,也会有许多相同的function功能,我们可以封装成一个父类 class,然后多个子类直接继承公共部分父类。

PHP5中使用parent::来引用父类的方法。

parent:: 可用于调用父类中定义的成员方法。

parent::的追溯不仅于直接父类。

通过parent::调用父类方法

<!-- 声明一个员工类,经理类继承自员工类 --> 
<? 
class employee{ 
 protected $sal=3000;  
 public function getSal(){ 
 $this->sal = $this->sal + 1200; 
 return $this->sal ; 
 } 
} 
 
class Manager extends employee { 
 //如果想让经理在员工工资的基础上多发1500元. 
 //必须先调用父类的getSal()方法. 
 public function getSal(){  
 parent::getSal();// 这里调用了父类的方法. 
 $this->sal = $this->sal + 1500; 
 return $this->sal ; 
 } 
} 
$emp = new employee(); 
echo "普通员工的工资是 " . $emp->getSal(); 
echo "<br>"; 
//xiariboke.com 
$manager = new Manager(); 
echo "经理的工资是: " . $manager->getSal(); 
?>

程序运行结果:

普通员工的工资是 4200

经理的工资是: 5700

父类的private属性

这个东西解释起来十分的不爽。

Private属性是不能被继承的,如果父类有私有的属性。那么父类的方法只为父类的私有属性服务。

下面的例子看起来很奇怪,在子类中重新定义了一个属性$sal,系统却返回了父类的属性。

<?php 
class employee{ 
 private $sal=3000; 
 //protected $sal=3000; 
 public function getSal(){  
 return $this->sal; 
 }  
} 
 
class Manager extends employee { 
 protected $sal=5000; 
 
 public function getParentSal(){ 
 //这里返回的是父类的private属性. 
 return parent::getSal(); 
 } 
} 
$manager = new Manager(); 
echo "PHP ".phpversion()."<br>"; 
echo $manager->getSal(); 
echo "<br>"; 
echo "parent's \$sal ".$manager->getParentSal(); 
//xiariboke.com 
?>

程序运行结果:

PHP 5.2.9

3000

parent's $sal 3000

如果父类中的属性被子类重写了。结果是这样的。注意 第5行的属性定义变成了protected。

<?php 
class employee{ 
 //private $sal=3000; 
 protected $sal=3000; 
 public function getSal(){  
 return $this->sal; 
 }  
} 
 
class Manager extends employee { 
 protected $sal=5000; 
 //xiariboke.com 
 public function getParentSal(){ 
 //这里返回的是父类的private属性. 
 return parent::getSal(); 
 } 
} 
$manager = new Manager(); 
echo "PHP ".phpversion()."<br>"; 
echo $manager->getSal(); 
echo "<br>"; 
echo "parent's \$sal ".$manager->getParentSal(); 
 
?>

程序运行结果:

PHP 5.2.9

5000

parent's $sal 5000

子类中重写的方法对当前private有效。

<?php 
class employee{ 
 private $sal=3000; 
 public function getSal(){  
 return $this->sal; 
 } 
} 
 
class Manager extends employee { 
 private $sal=5000; 
 //重写过的方法 
 public function getSal(){  
 return $this->sal; 
 }  
 public function getParentSal(){ 
 //这里返回的是父类的private属性. 
 return parent::getSal(); 
 } 
} 
$manager = new Manager(); 
echo "PHP ".phpversion()."<br>"; 
echo $manager->getSal(); 
echo "<br>"; 
echo "parent's \$sal ".$manager->getParentSal(); 
 
?>

程序运行结果:

PHP 5.2.9

5000

parent's $sal 3000

打开zend调试状态看看,内存中的情况。注意最下面,有两个$sal 。分别是 3000 和 5000 。

<?php 
class employee{ 
 private $sal=3000; 
 public function getSal(){  
 return $this->sal; 
 }  
} 
class Manager extends employee { 
 protected $sal=5000; 
 public function getParentSal(){ 
 return $this->sal; 
 } 
} 
$manager = new Manager(); 
echo "PHP ".phpversion()."<br>"; 
echo $manager->getSal(); 
 
?>

程序运行结果:

PHP 5.2.9

3000

将父类的属性$sal 改成 protected ,子类重写了父类的属性。在内存中只有一个 $sal 。

<?php 
class employee{ 
 protected $sal=3000; 
 public function getSal(){  
 return $this->sal; 
 }  
} 
class Manager extends employee { 
 protected $sal=5000; 
 public function getParentSal(){ 
 return $this->sal; 
 } 
} 
$manager = new Manager(); 
echo "PHP ".phpversion()."<br>"; 
echo $manager->getSal(); 
 
?>

程序运行结果:

PHP 5.2.9

5000

如果你学过java,你会觉得这一切都是很难理解的。

在Java中当子类被创建时,父类的属性和方法在内存中都被创建,甚至构造函数也要被调用。

PHP5不是这样,PHP5调用父类用的是parent:: 而不是 parent-> ,这足以说明PHP5不想在内存中让父类也被创建。PHP5想让继承变的比Java更简单。

适应下就好。

这样调用会让PHP5.1.1溢出。新版不知道有没有问题。

<?php 
class employee{ 
 private $sal=3000; 
 public function getSal(){  
 return parent::$this->sal; 
 }  
} 
 
class Manager extends employee { 
 protected $sal=5000; 
 public function getSal(){  
 return parent::$this->getSal(); 
 } 
} 
$manager = new Manager(); 
echo "PHP ".phpversion()."<br>"; 
echo $manager->getSal(); 
 
?>

第12行改成这样就好了。注意比较。

return parent:: getSal();

这样的代码引起了递归操作,子类调用父类的方法,父类又调用子类方法。

return parent::$this->getSal();

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

PHP 相关文章推荐
数据库相关问题
Oct 09 PHP
用PHP调用数据库的存贮过程!
Oct 09 PHP
PHP 页面跳转到另一个页面的多种方法方法总结
Jul 07 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
Jan 29 PHP
基于php实现长连接的方法与注意事项的问题
May 10 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
Mar 21 PHP
如何正确配置Nginx + PHP
Jul 15 PHP
Laravel 5.3 学习笔记之 安装
Aug 28 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
Feb 15 PHP
thinkPHP5.0框架引入Traits功能实例分析
Mar 18 PHP
php-app开发接口加密详解
Apr 18 PHP
TP5框架页面跳转样式操作示例
Apr 05 PHP
php输出含有“#”字符串的方法
Jan 18 #PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
Jan 17 #PHP
php中preg_replace正则替换用法分析【一次替换多个值】
Jan 17 #PHP
yii使用bootstrap分页样式的实例
Jan 17 #PHP
关于Laravel Route重定向的一个注意点
Jan 16 #PHP
php文件管理基本功能简单操作
Jan 16 #PHP
Python中使用django form表单验证的方法
Jan 16 #PHP
You might like
php $_ENV为空的原因分析
2009/06/01 PHP
php教程 插件机制在PHP中实现方案
2012/11/02 PHP
php操作mysql数据库的基本类代码
2014/02/25 PHP
thinkphp模板的包含与渲染实例分析
2014/11/26 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
PHP实现断点续传乱序合并文件的方法
2018/09/06 PHP
学习js所必须要知道的一些
2007/03/07 Javascript
JS 控件事件小结
2012/10/31 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
js对文章内容进行分页示例代码
2014/03/05 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
2015/06/19 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
input 禁止输入特殊字符的四种实现方式
2016/08/24 Javascript
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
JS 实现微信扫一扫功能
2018/09/14 Javascript
JS实现水平移动与垂直移动动画
2019/12/19 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python访问纯真IP数据库脚本分享
2015/06/29 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
python实现微信接口(itchat)详细介绍
2017/10/23 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
详解Python中的format格式化函数的使用方法
2019/11/20 Python
Django中的session用法详解
2020/03/09 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
HTML5标签与HTML4标签的区别示例介绍
2013/07/18 HTML / CSS
介绍一下HDLC(High-Level Data Link Control)高层数据链路协议
2012/01/21 面试题
厨师岗位职责
2013/11/12 职场文书
企业承诺书格式范文
2015/04/28 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书
物业管理交接协议书
2016/03/24 职场文书
Android自定义scrollview实现回弹效果
2022/04/01 Java/Android
使用Redis做预定库存缓存功能
2022/04/02 Redis