PHP 5.0对象模型深度探索之起步

 更新时间:2016年11月25日 16:15  点击:1776
  面向对象编程被设计来为大型软件项目提供解决方案,尤其是多人合作的项目. 当源代码增长到一万行甚至更多的时候,每一个更动都可能导致不希望的副作用. 这种情况发生于模块间结成秘密联盟的时候,就像第一次世界大战前的欧洲。
  //haohappy注:喻指模块间的关联度过高,相互依赖性太强.更动一个模块导致其它模块也必须跟着更动。
  想像一下,如果有一个用来处理登录的模块允许一个信用卡处理模块来分享它的数据库连接. 当然出发点是好的,节省了进行另一个数据库连接的支出.然而有时,登录处理模块改变了其中一个变量的名字,就可能割断了两者间的协议.导致信用卡模块的处理出错,进而导致处理的模块出错. 很快地,体系中所有无关的模块都可能由此出错.
  因此,我觉得有点戏剧性地,绝大多数程序员都对耦合和封装心存感激. 耦合是两个模块间依赖程度的量度. 耦合越少越好.我们希望能够从已有的项目中抽走一个模块并在另一个新项目中使用.
  我们也希望在某个模块内部大规模的更动而不用担心对其他模块的影响. 封装的原则可以提供这个解决方案.模块被看待成相对独立,并且模块间的数据通信通过接口来进行. 模块不通过彼此的变量名来窥探另一个模块,它们通过函数来礼貌地发送请求.
  封装是你可以在任何编程语言中使用的一个原则. 在PHP和许多面向过程的语言中,可以偷懒是很有诱惑的.没有什么可以阻止你通过模块来构建一个假想的WEB. 面向对象编程是使程序员不会违背封装原则的一种方法.
  在面向对象编程中,模块被组织成一个个对象. 这些对象拥有方法和属性. 从抽象的角度来看,方法是一个对象的所做的动作,而属性是对象的特性.从编程角度来看,方法就是函数而属性是变量. 在一个理想化的面向对象体系中,每个部份都是一个对象. 体系由对象及对象间通过方法来形成的联系构成.
  一个类定义了对象的属性. 如果你在烘烤一组甜饼对象,那么类将会是甜饼机. 类的属性和方法是被调用的成员. 人们可以通过说出数据成员或者方法成员来表达.
  每种语言提供了不同的途径来访问对象. PHP从C 中借用概念,提供一个数据类型用来在一个标识符下包含函数和变量。最初设计PHP的时候,甚至PHP3被开发出时,PHP并不打算提供开发超过10万行代码的大型项目的能力。随着PHP和Zend引擎的发展,开发大型项目变得有可能,但无论你的项目规模多大,用类来书写你的脚本将可以让代码实现重用。这是一个好主意,特别当你愿意与别人分享你的代码的时候。
当你声明一个类,你需要列出对象应有的所有变量和所有函数—被称为属性和方法。列表1中显示了一个类的构成. 注意在大括号({})内你只能声明变量或者函数。列表2中显示了如何在一个类中定义三个属性和两个方法。
  列表1

class Name extends Another Class
{
 Access Variable Declaration
 Access Function Declaration
}
  列表2

//定义一个跟踪用户的类
class User
{
 //属性
 public $name;
 private $password, $lastLogin;
 //方法
 public function __construct($name, $password)
 {
  $this->name = $name;
  $this->password = $password;
  $this->lastLogin = time();
  $this->accesses ;
 }
 // 获取最后访问的时间
 function getLastLogin()
 {
  return(date("M d Y", $this->lastLogin));
 }
}
//创建一个对象的实例
$user = new User("Leon", "sdf123");
//获取最后访问的时间
print($user->getLastLogin() ."
n");
//打印用户名
print("$user->name n");
?>
  当你声明属性,你不需要指明数据类型。变量可能是整型,字符串或者是另一个对象,这取决于实际情况。在声明属性时增加注释是一个好主意,标记上属性的含义和数据类型。
  当你声明一个方法,你所做的和在类外部定义一个函数是一样的。方法和属性都有各自的命名空间。这意味着你可以安全地建立一个与类外部函数同名的方法,两者不会冲突。例如,一个类中可以定义一个名为date()的方法。但是你不能将一个方法命名为PHP的关键字,如for或者while。
  类方法可能包含PHP中所谓的type hint. Type hint 是另一个传递参数给方法的类的名字. 如果你的脚本调用方法并传递一个不是类的实例的变量,PHP将产生一个”致命(fatal)错误” 。你可能没有给其它类型给出type hint,就像整型,字符串,或者布尔值. 在书写的时候, type hint是否应当包含数组类型仍存在争议。
  Type hint是测试函数参数或者运算符的实例的数据类型的捷径. 你可能总是返回这个方法. 确认你强制让一个参数必须是哪种数据类型,如整型. 列表3确保编译类只产生Widget的实例。
  列表3
  1. 当您在寻找关于某个具体的 PHP 函数的信息时,请转至 http://php.net/ 。例如:http://php.net/join。这将直接把您带到您地理位置附近的一台服务器上的联机手册中的正确位置上。
 
  2. 试试这个:pear install apc 。pear 命令是一个有用的安装程序,它甚至可以用来安装用 C 编写的 PHP 扩展。在这种情况下,它将安装 APC opcode 高速缓存扩展。
 
  3. 使用 opcode 高速缓存来提高性能。参见 #2。
 
  4. 在 PHP 中混合 OOP 和过程代码不存在任何错误。在对象有意义的时候使用对象,其余情况转用过程。
 
  5. 用您自己定制的 C 或 C 扩展来扩展 PHP 比您想象的要更容易。参见 PHP 源代码版本中的 README.EXT_SKEL。
 
  6. echo <<<EOB 语法对于用完整的 $variable 替换来输出文本块非常有用,并且无需避开任何东西。EOB;
  7. PATH_INFO 很棒!用它来清除难看的 URL。
 
  8. 使用一个记录程序,pear install apd。
 
  9. 数据库抽象大部分是虚构的故事。直接的数据库调用没什么错,它利用您选择的数据库必须提供的所有技巧和窍门,以从中获得尽可能高的性能。
 
  10. 保持使用您的基础技术,并构建简单的程序块。使用无线程的 Web 服务器,避免复杂的框架和抽象层,从而给您自己机会来跟踪和调试可能出现的任何问题。解决 Web 问题很简单;别试图使它变得困难。


  在zend.com找到了答案,提供了一组例子,这里下载:http://www.zend.com/apidoc/examples.tar.gz
  这样返回一个数组
PHP_FUNCTION(array_experiments)
{
zval *new_element;
MAKE_STD_ZVAL(new_element);
array_init(return_value);
ZVAL_LONG(new_element, 10);
zend_hash_index_update(HASH_OF(return_value), 3, (void *)&new_element, sizeof(zval *), NULL);
add_next_index_long(return_value, 20);
}
  具体函数参见php手册 zend api部分 不过这部分的内容一直都没有翻译成中文的...看得时候好吃力,用金山词霸也看不懂,英文太烂了,期待那天那个高人没事儿给翻译了...呵呵


  Netscape共同创办人Marc Andreessen在周三(10/19)举行的Zend/PHP会议上预言,简单的PHP描述性语言撰写工具,在Web-based应用程序的开发上,将会比Java更受欢迎。
 在升阳(Sun Microsystems)于1995年发表Java之后,由于Java的友善接口让工程师设计软件更为容易,受到工程师欢迎,但十年下来Java陆陆续续被加入了强大的功能,反而使它变得不容易操作。Marc Andreessen指出,现在的Java可能比C 更难学,在此同时,PHP传承了Java的简单精神,并创造一个比Java更容易使用的程序开发环境。
 
  PHP为一开放原始码项目,其中包括可以简化程序的描述性语言引擎以及一个大的链接库,也有专门开发PHP的公司,如Zend就有销售PHP套装产品、程序撰写工具及技术支持服务。
 
  Andreessen的看法可能很难博得Java拥护者的认同,因为现阶段全球仍有数百万专研Java的工程师,也有数百家公司参与Java Community Process(JCP),在JCP中共同主掌Java的命运。但是,就算是大力扶植Java、甚至以Java为WebSphere服务器软件核心的IBM,也认为PHP的前途会比Java来得好。
 
  IBM新网络科技事业处副总裁Rod Smith就说,「简单」是PHP最大的特色,而且它不会为了与其它语言竞争而加入新的语言功能,Java显然就不是这么做。
 
  而且,PHP的势力也不小,目前约有2200万的网站采用PHP,包括Yahoo!、Lufthansa等知名网站,数量并持续增加中,并有450个软件工程师有权去审核在PHP软件上的任何变动。
 
  与Java相较,PHP可用范畴限制较多,它仅能用在网络服务器上,不像Java,同时可用在网络服务器、个人计算机、手机、芯片卡或其它装置。
 
  Java和PHP除了在某些方面相互竞争之外,某个程度来看,也在彼此靠陇。甲骨文产品策略副总Ken Jacobs表示,即使甲骨文(Oracle)销售同时可执行Java及PHP的Java服务器与数据库软件,但正为Java加上一项额外的新功能,让这两个软件项目可以协同运作;更具体的说,Java规格需求223(JSR 223)将会「协助建构在Java社群与PHP社群之间的那座桥梁」。
 
  日前才发表可以分享照片等内容网站「Ning」的Marc Andreessen也说,现在Ning也同时执行Java与PHP,其中核心系统是由Java组成,比起该站所有可看见的应用程序都是由PHP写成,Java更像是操作系统层级。
 
  就像其它诸如Linux及Apache的开放原始码项目,PHP目前也受到计算机工业主要大厂的庇佑,像IBM跟Oracle都致力开发让PHP软件可以撷取旗下数据库的程序。事实上,IBM与Oracle的行为就像在为PHP背书,连这两大厂都支持PHP,证明PHP也许就是个好东西。


[!--infotagslink--]

相关文章

  • java8如何用Stream查List对象某属性是否有重复

    这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
  • R语言 如何删除指定变量或对象

    这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • JavaScript预解析,对象详解

    这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
  • 如何在Spring WebFlux的任何地方获取Request对象

    这篇文章主要介绍了如何在Spring WebFlux的任何地方获取Request对象,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下...2021-01-26
  • 牛叉的Jquery――Jquery与DOM对象的互相转换及DOM的三种操作

    只有jQuery对象才能调用jQuery类库的各种函数,同样有些dom对象的属性和方法在jQuery上也是无法调用的,不过基本上jQuery类库提供的函数包含了所有的dom操作。这就需要我们知道如何将jQuery对象和DOM的相互转换的方法。1...2015-10-30
  • 详解为什么现代系统需要一个新的编程模型

    如今高要求的分布式系统的建造者遇到了不能完全由传统的面向对象编程(OOP)模型解决的挑战,但这可以从Actor模型中获益。...2021-05-20
  • js如何打印object对象

    js调试中经常会碰到输出的内容是对象而无法打印的时候,光靠alert只能打印出object标示,却不能打印出来里面的内容,甚是不方便,于是各方面整理总结了如下一个函数,能够将数组或者对象这类的结果一一打印出来,具体代码如下: fu...2015-10-21
  • 替换json对象中的key最佳方案

    本文给大家介绍如何替换json对象中的key,通过实例代码给大家介绍key的替换方法,代码也很简单,需要的朋友参考下吧...2021-06-02
  • javascript self对象使用详解

    这篇文章主要介绍了javascript self对象使用详解的相关资料,需要的朋友可以参考下...2016-10-20
  • ActiveX部件不能创建对象:dm.dmsoft代码:800A01AD

    vbs调用插件报:ActiveX部件不能创建对象,代码:800A01AD,一般是因为病毒导致dll文件丢失或者64系统问题导致,需要的朋友可以参考下...2020-06-30
  • 解决在keras中使用model.save()函数保存模型失败的问题

    这篇文章主要介绍了解决在keras中使用model.save()函数保存模型失败的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-21
  • Bootstrap媒体对象的实现

    在web页面中,图片居左,内容居右排列,是非常常见的效果,它也就是媒体对象,它是一种抽象的样式,可以用来构建不同类型的组件。本文给大家介绍Bootstrap媒体对象的实现,感兴趣的朋友一起学习吧...2016-05-04
  • 理解JavaScript事件对象

    这篇文章主要为大家介绍了JavaScript事件对象,了解JavaScript事件...2016-01-26
  • Xml中使用foreach遍历对象实现代码

    这篇文章主要介绍了Xml中使用foreach遍历对象实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-12-04
  • 解决SpringCloud Feign传对象参数调用失败的问题

    这篇文章主要介绍了解决SpringCloud Feign传对象参数调用失败的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-24
  • JS实现简单面向对象的颜色选择器实例

    这篇文章主要介绍了JS实现简单面向对象的颜色选择器,以完整实例形式分析了JavaScript基于面向对象实现颜色选择器的具体步骤与实现技巧,需要的朋友可以参考下...2016-04-23
  • javascript创建对象的几种模式介绍

    下面小编就为大家带来一篇javascript创建对象的几种模式介绍。小编觉得挺不错的,现在分享给大家,也给大家做个参考...2016-05-09
  • vue - props 声明数组和对象操作

    这篇文章主要介绍了vue - props 声明数组和对象操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-30
  • 对象题目的一个坑 理解Javascript对象

    这篇文章主要介绍了Javascript对象,特别为大家分享了对象题目的一个坑,提供了解题思路,感兴趣的小伙伴们可以参考一下...2015-12-24
  • JavaScript Blob对象原理及用法详解

    这篇文章主要介绍了JavaScript Blob对象原理及用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-14