首页 > 编程技术 > php

PHP5.0对象模型深度探索之起步

发布时间:2016-11-25 15:16

面向对象编程被设计来为大型软件项目提供解决方案,尤其是多人合作的项目. 当源代码增长到一万行甚至更多的时候,每一个更动都可能导致不希望的副作用. 这种情况发生于模块间结成秘密联盟的时候,就像第一次世界大战前的欧洲。

  //haohappy注:喻指模块间的关联度过高,相互依靠性太强.更动一个模块导致其它模块也必须跟着更动。

  想像一下,假如有一个用来处理登录的模块答应一个信用卡处理模块来分享它的数据库连接. 当然出发点是好的,节省了进行另一个数据库连接的支出.然而有时,登录处理模块改变了其中一个变量的名字,就可能割断了两者间的协议.导致信用卡模块的处理出错,进而导致处理的模块出错. 很快地,体系中所有无关的模块都可能由此出错.

  因此,我觉得有点戏剧性地,绝大多数程序员都对耦合和封装心存感激. 耦合是两个模块间依靠程度的量度. 耦合越少越好.我们希望能够从已有的项目中抽走一个模块并在另一个新项目中使用.

  我们也希望在某个模块内部大规模的更动而不用担心对其他模块的影响. 封装的原则可以提供这个解决方案.模块被看待成相对独立,并且模块间的数据通信通过接口来进行. 模块不通过彼此的变量名来窥探另一个模块,它们通过函数来礼貌地发送请求.

  封装是你可以在任何编程语言中使用的一个原则. 在PHP和许多面向过程的语言中,可以偷懒是很有诱惑的.没有什么可以阻止你通过模块来构建一个假想的WEB. 面向对象编程是使程序员不会违反封装原则的一种方法.

  在面向对象编程中,模块被组织成一个个对象. 这些对象拥有方法和属性. 从抽象的角度来看,方法是一个对象的所做的动作,而属性是对象的特性.从编程角度来看,方法就是函数而属性是变量. 在一个理想化的面向对象体系中,每个部份都是一个对象. 体系由对象及对象间通过方法来形成的联系构成.

  一个类定义了对象的属性. 假如你在烘烤一组甜饼对象,那么类将会是甜饼机. 类的属性和方法是被调用的成员. 人们可以通过说出数据成员或者方法成员来表达.

  每种语言提供了不同的途径来访问对象. PHP从C 中借用概念,提供一个数据类型用来在一个标识符下包含函数和变量。最初设计PHP的时候,甚至PHP3被开发出时,PHP并不打算提供开发超过10万行代码的大型项目的能力。随着PHP和Zend引擎的发展,开发大型项目变得有可能,但无论你的项目规模多大,用类来书写你的脚本将可以让代码实现重用。这是一个好主意,非凡当你愿意与别人分享你的代码的时候。

  有关对象的想法是计算机科学上最令人兴奋的概念之一。开始很难把握它,但我可以保证,一旦你把握了它,用它的思维来思考将会非常自然。

  PHP5 的对象模型

  PHP5有一个单重继续的,限制访问的,可以重载的对象模型. 本章稍后会具体讨论的”继续”,包含类间的父-子关系. 另外,PHP支持对属性和方法的限制性访问. 你可以声明成员为private,不答应外部类访问. 最后,PHP答应一个子类从它的父类中重载成员.

  PHP5的对象模型把对象看成与任何其它数据类型不同,通过引用来传递. PHP不要求你通过引用(reference)显性传递和返回对象. 在本章的最后将会具体阐述基于引用的对象模型. 它是PHP5中最重要的新特性.

  有了更直接的对象模型,就拥有了附加的优势: 效率提高, 占用内存少,并且具有更大的灵活性.

  在PHP的前几个版本中,脚本默认复制对象.现在PHP5只移动句柄,需要更少的时间. 脚本执行效率的提升是由于避免了不必要的复制. 在对象体系带来复杂性的同时,也带来了执行效率上的收益. 同时,减少复制意味着占用更少的内存,可以留出更多内存给其它操作,这也使效率提高.

  Zand引擎2具有更大的灵活性. 一个令人兴奋的发展是答应析构--在对象销毁之前执行一个类方法. 这对于利用内存也很有好处,让PHP清楚地知道什么时候没有对象的引用,把空出的内存分配到其它用途.

  PHP5的内存治理

  对象传递

  PHP5使用了Zend引擎II,对象被储存于独立的结构Object Store中,而不像其它一般变量那样储存于Zval中(在PHP4中对象和一般变量一样存储于Zval)。在Zval中仅存储对象的指针而不是内容(value)。当我们复制一个对象或者将一个对象当作参数传递给一个函数时,我们不需要复制数据。仅仅保持相同的对象指针并由另一个zval通知现在这个特定的对象指向的Object Store。由于对象本身位于Object Store,我们对它所作的任何改变将影响到所有持有该对象指针的zval结构----表现在程序中就是目标对象的任何改变都会影响到源对象。.这使PHP对象看起来就像总是通过引用(reference)来传递,因此PHP中对象默认为通过“引用”传递,你不再需要像在PHP4中那样使用&来声明。

  垃圾回收机制

  某些语言,最典型的如C,需要你显式地要求分配内存当你创建数据结构。一旦你分配到内存,就可以在变量中存储信息。同时你也需要在结束使用变量时释放内存,这使机器可以空出内存给其它变量,避免耗光内存。

  PHP可以自动进行内存治理,清除不再需要的对象。PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。

  例如:

<?php
class Person{}
function sendEmailTo(){}
$haohappy = new Person( );
// 建立一个新对象: 引用计数 Reference count = 1
$haohappy2 = $haohappy;
// 通过引用复制: Reference count = 2
unset($haohappy);
// 删除一个引用: Reference count = 1
sendEmailTo($haohappy2);
// 通过引用传递对象:
// 在函数执行期间:
// Reference count = 2
// 执行结束后:
// Reference count = 1


unset($haohappy2);
// 删除引用: Reference count = 0 自动释放内存空间
?>

综述

  正则表达式是一种可以用于模式匹配和替换的强有力的工具。正则表达式可以让用户通过使用一系列的非凡字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。

  如何使用基本模式匹配?

  模式,是正规表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用非凡的字符表示一个范围内的字符重复出现,或表示上下文。我们先看一些正则表达式中的非凡字符。

  非凡字符"^"用来匹配以指定字符串开头的字符串。例如:

    "^hello" :这个模式与字符串"hello,PHP world!"匹配,但是与"Say hello to you"不匹配。

  非凡字符"$"用来匹配以指定字符串结尾的字符串。例如:

    "you$" :这个模式与"How are you"匹配,与"your"不匹配。

  当非凡字符"^"和"$"同时使用时,表示精确匹配。例如:

    "^hello$" :这个模式只匹配字符串"hello"。

  假如一个模式不包括"^"和"$",那么它与任何包含该模式的字符串匹配。例如:     "you" :与字符串"What is your name?"是匹配的。

  在该模式中的字母只是普通的字符,数字也是一样的。

  假如要用到其他一些稍微复杂的字符,如标点符号和空白字符(比如空格、制表符等),就要要用到转义序列。所有的转义序列都用反斜杠("")打头,例如制表符的转义序列是:"t"。所以假如我们要检测一个字符串是否以制表符开头,可以用这个模式:

    "^t"

  类似的,用"n"表示换行,"r"表示回车,反斜杠本身用""表示,句号"."用"."表示,依此类推。

  如何使用字符簇?

  假如要判定用户输入的电话号码、地址、EMAIL地址、信用卡号码等是否有效,用普通的基于字面的字符串比较是不够的。所以要用一种更好的方法来描述我们想要的模式,这就是字符簇。

  比如,要建立一个表示所有元音字符的字符簇,就可以这样做:


    "[AaEeIiOoUu]" :这个模式与任何元音字符匹配,但只能表示一个字符。

  用非凡符号"-"可以表示一个字符的范围,如:
"[a-z]" //匹配字母a-z,即所有的小写字母
"[A-Z]" //匹配字母A-Z,即所有的大写字母
"[a-zA-Z]" //匹配所有的字母
"[0-9]" //匹配所有的数字
"[0-9.-]" //匹配所有的数字,以及句号和减号
"[ ]" //匹配所有的白字符


  同样的,这些也只匹配一个字符。

  假如要匹配由一个小写字母和一位数字组成的字符串,比如"a4"、"b5"或"f1",但不是"aa4"、"b5a4" 或"f12"的话,用这个模式:

    "^[a-z][0-9]$"

  尽管[a-z]代表26个字母的范围,但在这里它只能与第一个字符是小写字母的字符串匹配。

  我们已经知道"^"表示字符串的开头,但是当在一组方括号里使用"^"时,它表示"非"或"排除"的意思,经常用来剔除某个字符。

1. 当您在寻找关于某个具体的 PHP 函数的信息时,请转至 http://php.net/ 。例如:http://php.net/join。这将直接把您带到您地理位置四周的一台服务器上的联机手册中的正确位置上。

  2. 试试这个:pear install apc 。pear 命令是一个有用的安装程序,它甚至可以用来安装用 C 编写的 PHP 扩展。在这种情况下,它将安装 APC opcode 高速缓存扩展。

  3. 使用 opcode 高速缓存来提高性能。

  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 问题很简单;别试图使它变得困难。

PHP5学习笔记
第一节--面向对象编程
面向对象编程被设计来为大型软件项目提供解决方案,尤其是多人合作的项目. 当源代码增长到一万行甚至更多的时候,每一个更动都可能导致不希望的副作用. 这种情况发生于模块间结成秘密联盟的时候,就像第一次世界大战前的欧洲.
//haohappy注:喻指模块间的关联度过高,相互依靠性太强.更动一个模块导致其它模块也必须跟着更动.
想像一下,假如有一个用来处理登录的模块答应一个信用卡处理模块来分享它的数据库连接. 当然出发点是好的,节省了进行另一个数据库连接的支出.然而有时,登录处理模块改变了其中一个变量的名字,就可能割断了两者间的协议.导致信用卡模块的处理出错,进而导致处理的模块出错. 很快地,体系中所有无关的模块都可能由此出错.
因此,我觉得有点戏剧性地,绝大多数程序员都对耦合和封装心存感激. 耦合是两个模块间依靠程度的量度. 耦合越少越好.我们希望能够从已有的项目中抽走一个模块并在另一个新项目中使用.
我们也希望在某个模块内部大规模的更动而不用担心对其他模块的影响. 封装的原则可以提供这个解决方案.模块被看待成相对独立,并且模块间的数据通信通过接口来进行. 模块不通过彼此的变量名来窥探另一个模块,它们通过函数来礼貌地发送请求.
封装是你可以在任何编程语言中使用的一个原则. 在PHP和许多面向过程的语言中,可以偷懒是很有诱惑的.没有什么可以阻止你通过模块来构建一个假想的WEB. 面向对象编程是使程序员不会违反封装原则的一种方法.
在面向对象编程中,模块被组织成一个个对象. 这些对象拥有方法和属性. 从抽象的角度来看,方法是一个对象的所做的动作,而属性是对象的特性.从编程角度来看,方法就是函数而属性是变量. 在一个理想化的面向对象体系中,每个部份都是一个对象. 体系由对象及对象间通过方法来形成的联系构成.
一个类定义了对象的属性. 假如你在烘烤一组甜饼对象,那么类将会是甜饼机. 类的属性和方法是被调用的成员. 人们可以通过说出数据成员或者方法成员来表达.
每种语言提供了不同的途径来访问对象. PHP从C 中借用概念,提供一个数据类型用来在一个标识符下包含函数和变量。最初设计PHP的时候,甚至PHP3被开发出时,PHP并不打算提供开发超过10万行代码的大型项目的能力。随着PHP和Zend引擎的发展,开发大型项目变得有可能,但无论你的项目规模多大,用类来书写你的脚本将可以让代码实现重用。这是一个好主意,非凡当你愿意与别人分享你的代码的时候。
有关对象的想法是计算机科学上最令人兴奋的概念之一。开始很难把握它,但我可以保证,一旦你把握了它,用它的思维来思考将会非常自然。
第二节--PHP5 的对象模型
PHP5 有一个单重继续的,限制访问的,可以重载的对象模型. 本章稍后会具体讨论的”继续”,包含类间的父-子关系. 另外,PHP支持对属性和方法的限制性访问. 你可以声明成员为private,不答应外部类访问. 最后,PHP答应一个子类从它的父类中重载成员.
//haohappy注:PHP4中没有private,只有public.private对于更好地实现封装很有好处.
PHP5的对象模型把对象看成与任何其它数据类型不同,通过引用来传递. PHP不要求你通过引用(reference)显性传递和返回对象. 在本章的最后将会具体阐述基于句柄的对象模型. 它是PHP5中最重要的新特性.
有了更直接的对象模型,基于句柄的体系有附加的优势: 效率提高, 占用内存少,并且具有更大的灵活性.
在PHP 的前几个版本中,脚本默认复制对象.现在PHP5只移动句柄,需要更少的时间. 脚本执行效率的提升是由于避免了不必要的复制. 在对象体系带来复杂性的同时,也带来了执行效率上的收益. 同时,减少复制意味着占用更少的内存,可以留出更多内存给其它操作,这也使效率提高.
//haohappy注:基于句柄,就是说两个对象可以指向同一块内存,既减少了复制动作,又减少对内存的占用.
Zand引擎2具有更大的灵活性. 一个令人兴奋的发展是答应析构--在对象销毁之前执行一个类方法. 这对于利用内存也很有好处,让PHP清楚地知道什么时候没有对象的引用,把空出的内存分配到其它用途.
第三节--定义一个类
当你声明一个类,你需要列出对象应有的所有变量和所有函数

十天学会php之第一天

  以 Apache web server 和 MY SQL 作为WEB服务器和数据库在php-4.3.3下的环境做程序简单的构建和访问查看数据库用 PHPMYADMIN。

  PHP的语法:

  1、嵌入方法:

  PHP可以是以<?php或者是<?为开始符号,结束符号是?>,当然也可以自己指定。

  2、引用文件:

  引用文件的方法有两种:require 及 include。

  require 的使用方法如 require("MyRequireFile.php"); 。这个函数通常放在 PHP 程序的最前面,PHP 程序在执行前,就会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。常用的函数,亦可以这个方法将它引入网页中。

  include 使用方法如 include("MyIncludeFile.php"); 。这个函数一般是放在流程控制的处理部分中。PHP 程序网页在读到 include 的文件时,才将它读进来。这种方式,可以把程序执行时的流程简单化。

  3、注释方法:

<?php
echo "这是第一种例子。n" ; // 本例是 C 语法的注释
/* 本例采用多行的
注释方式 */
echo "这是第二种例子。n" ;
echo "这是第三种例子。n" ; # 本例使用 UNIX Shell 语法注释
?>

  4、变量类型:

$mystring = "我是字符串" ;
$NewLine = "换行了n" ;
$int1 = 38 ;
$float1 = 1.732 ;
$float2 = 1.4E 2 ;
$MyArray1 = array( "子" , "丑" , "寅" , "卯" );

这里引出两个问题:第一PHP变量以"$"开头,第二PHP语句以";"结尾。这两个遗漏也是程序上大多错误所在。

  5、运算符号:

数学运算:

符号 意义
加法运算
- 减法运算
* 乘法运算
/ 除法运算
% 取余数
累加
-- 递减

  字符串运算:

  运算符号只有一个,就是英文的句号"."。它可以将字符串连接起来,变成合并的新字符串。

<?
$a = "PHP 4" ;
$b = "功能强大" ;
echo $a.$b;
?>

  这里也引出两个问题,首先PHP中输出语句是echo,第二类似ASP中的<%=变量%>,PHP中也可以<?=变量?>。

逻辑运算:
符号 意义
< 小于
> 大于
<= 小于或等于
>= 大于或等于
== 等于
!= 不等于

标签:[!--infotagslink--]

您可能感兴趣的文章: