实例简介PHP的一些高级面向对象编程的特性


Posted in PHP onNovember 27, 2015

一般来说,学习PHP需要了解下面的一些特性:

对象克隆。PHP5中对OOP模型的主要改进之一,是将所有对象都看作引用,而不是值。但是,如果所有对象都视为引用,那么如何创建对象的副本呢?答案是通过克隆对象。

<?php
class Corporate_Drone{
 private $employeeid;
 private $tiecolor;
 function setEmployeeID($employeeid) {
 $this->employeeid = $employeeid;
 }

 function getEmployeeID() {
 return $this->employeeid;
 }
 
 function setTiecolor($tiecolor) {
 $this->tiecolor = $tiecolor;
 }
 
 function getTiecolor() {
 return $this->tiecolor;
 }
}

$drone1 = new Corporate_Drone();
$drone1->setEmployeeID("12345");
$drone1->setTiecolor("red");
$drone2 = clone $drone1;
$drone2->setEmployeeID("67890");

printf("drone1 employeeID:%d <br />",$drone1->getEmployeeID());
printf("drone1 tie color:%s <br />",$drone1->getTiecolor());
printf("drone2 employeeID:%d <br />",$drone2->getEmployeeID());
printf("drone2 tie color:%s <br />",$drone2->getTiecolor());
?>

继承。如前面所述,通过继承来构建类层次体系是OOP的关键概念。

class Employee {
 ...
}

class Executive extends Employee{
 ...
}

class CEO extends Executive{
 ...
}

接口。接口是一些未实现的方法定义和常量的集合,相当于一种类蓝本。接口只定义了类能做什么,而不涉及实现的细节。本章介绍PHP5对接口的支持,并提供了一些展示这个强大OOP特性的例子。

<?php
interface IPillage
{
 // CONST 1;
 function emptyBankAccount();
 function burnDocuments();
}

class Employee {

}

class Excutive extends Employee implements IPillage {
 private $totalStockOptions;
 function emptyBankAccount() {
 echo "Call CFO and ask to transfer funds to Swiss bank account";
 }
 function burnDocuments() {
 echo "Torch the office suite.";
 }
}

class test {
 function testIP(IPillage $ib) {
 echo $ib->emptyBankAccount();
 }
}
$excutive = new Excutive();
$test = new test();
echo $test->testIP($excutive);
?>

抽象类。抽象类实质上就是无法实例化的类。抽象类将由可实例化的类继承,后者称为具体类(concreate class)。抽象类可以完全实现、部分实现或者根本未实现。

abstract class Class_name
{
 //insert attribute definitions here
 //insert method definitions here
}

命名空间。命名空间可根据上下文划分各种库和类,帮肋你更为有效地管理代码库。

<?php
namespace Library;
class Clean {
 function printClean() {
 echo "Clean...";
 }
}
?>

<?php
include "test.php";
$clean = new \Library\Clean();
$clean->printClean();
?>

如果你使用过其他面向对象语言,可能会感到奇怪,为什么上述特性没有包括其他语言中熟悉的一些OOP特性?原因很简单,PHP不支持这些特性。为了让你不再感到迷惑,下面列出PHP不支持的高级OOP特性。

  • 方法重载。PHP不支持通过函数重载实现多态,根据Zend网站的讨论,可能永远都不会支持。要了解具体原因,可以查看http://www.zend.com/php/ask_experts.php
  • 操作符重载。目前不支持根据所修改数据的类型为操作符赋予新的含义。根据zend网站的讨论,将来实现这个特性的可能性也不大。
  • 多重继承。PHP不支持多重继承。但是支持实现多个接口。
PHP 相关文章推荐
php 图像函数大举例(非原创)
Jun 20 PHP
PHP字符串 ==比较运算符的副作用
Oct 21 PHP
php echo 输出字符串函数详解
May 13 PHP
PHP 获取客户端真实IP地址多种方法小结
May 15 PHP
PHP 获取MySQL数据库里所有表的实现代码
Jul 13 PHP
PHP Global变量定义当前页面的全局变量实现探讨
Jun 05 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
Jun 12 PHP
PHP清除数组中所有字符串两端空格的方法
Oct 20 PHP
基于递归实现的php树形菜单代码
Nov 19 PHP
Laravel 5 学习笔记
Mar 06 PHP
php curl 获取https请求的2种方法
Apr 27 PHP
分享10段PHP常用代码
Nov 11 PHP
PHP编程中的__clone()方法使用详解
Nov 27 #PHP
PHP通过反射动态加载第三方类和获得类源码的实例
Nov 27 #PHP
基于php实现随机合并数组并排序(原排序)
Nov 26 #PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
Nov 25 #PHP
php实现遍历多维数组的方法
Nov 25 #PHP
WordPress迁移时一些常见问题的解决方法整理
Nov 24 #PHP
基础的WordPress插件制作教程
Nov 24 #PHP
You might like
php htmlentities和htmlspecialchars 的区别
2008/08/18 PHP
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
2013/11/07 PHP
Symfony2框架创建项目与模板设置实例详解
2016/03/17 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
js导航菜单(自写)简单大方
2013/03/28 Javascript
extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面
2013/04/02 Javascript
js点击事件链接的问题解决
2014/04/25 Javascript
js实现的捐赠管理完整实例
2015/01/20 Javascript
js实现简单折叠、展开菜单的方法
2015/08/28 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
谷歌Chrome浏览器扩展程序开发小记
2016/01/06 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
2016/11/17 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
2017/05/17 Javascript
easyUI下拉列表点击事件使用方法
2017/05/18 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
2019/06/27 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
python Django模板的使用方法(图文)
2013/11/04 Python
Python中正则表达式的用法实例汇总
2014/08/18 Python
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
使用Python求解带约束的最优化问题详解
2020/02/11 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
Keras 使用 Lambda层详解
2020/06/10 Python
Joules美国官网:出色的英国风格
2017/10/30 全球购物
车贷收入证明范本
2014/09/14 职场文书
《梅花魂》教学反思
2016/02/18 职场文书
源码解读Spring-Integration执行过程
2021/06/11 Java/Android