Zend引擎的发展

 更新时间:2016年11月25日 17:41  点击:2127

本章的最后一节,Zeev讨论了Zend引擎带来的对象模型,非凡提到它与PHP的前几个版本中的模型有什么不同.
  当1997年夏天,我们开发出PHP3, 我们没有计划要使PHP具备面向对象的能力. 当时没有任何与类和对象有关的想法. PHP3是一个纯粹面向过程的语言. 但是,在1997.8.27的晚上PHP3 alpha版中增加了对类的支持. 增加一个新特性给PHP,当时仅需要极少的讨论,因为当时探索PHP的人太少. 于是从1997年八月起, PHP迈出了走向面向对象编程语言的第一步.

  确实,这只是第一步. 因为在这个设计中只有极少的相关的想法,对于对象的支持不够强大. 这个版本中使用对象仅是访问数组的一个很酷的方法而已. 取代使用$foo[“bar”],你可以使用看起来更漂亮的$foo->bar. 面向对象方法的主要的优势是通过成员函数或方法来储存功能. 例子6.18中显示了一个典型的代码块. 但是它和例6.19中的做法其实并没有太大不同.

  Listing 6.18 PHP 3 object-oriented programming PHP3中的面向对象编程

<?php
class Example
{
var $value = "some value";
function PrintValue()
{
print $this->value;
}
}
$obj = new Example();
$obj->PrintValue();
?>
  Listing 6.19 PHP 3 structural programming PHP3 PHP3中的结构化编程

<?php
function PrintValue($arr)
{
print $arr["value"];
}

function CreateExample()
{
$arr["value"] = "some value";
$arr["PrintValue"] = "PrintValue";

return $arr;
}

$arr = CreateExample();

//Use PHP's indirect reference
$arr["PrintValue"]($arr);
?>
  以上我们在类中写上两行代码,或者显示地传递数组给函数. 但考虑到PHP3中这两种选择并没有任何不同,我们仍然可以仅把对象模型当成一种”语法上的粉饰”来访问数组.

  想要用PHP来进行面向对象开发的人们,非凡是想使用设计模式的人,很快就发现他们碰壁了. 幸运地,当时(PHP3时代)没有太多人想用PHP来进行面向对象开发.

  PHP4改变了这种情况. 新的版本带来了引用(reference)的概念, 它答应PHP的不同标识符指向内存中的同一个地址. 这意味着你可以使用两个或更多的名称来给同一个变量命名,就像例6.20那样.

  Listing 6.20 PHP 4 references PHP4中的引用

<?php
$a = 5;

//$b points to the same place in memory as $a $b与$a指向内存中同个地址
$b = &$a;

//we're changing $b, since $a is pointing to 改变$b,指向的地址改变
//the same place - it changes too $a指向的地址也改变
$b = 7;

//prints 7 输出7
print $a;

测试硬件说明:
测试使用的是我的爱机,配置如下:
CPU:C433
内存:128M
硬盘:酷鱼2代20G

测试软件说明:
WIN32下用的是windows nt server4,sp5,apache 1.3.12,php3.0.15和php4rc1,mysql 3.22.29,oracle 8.0.5
linux下用的是bluepoint linux1.0, apache 1.3.12, php4rc1,mysql 3.22.32

测试代码说明:
使用一个很简单的表,mysql和oracle使用的表结构是一样的,都只有三个字段,结构如下:
mysql的表结构:
CREATE TABLE board (
board_id smallint(6) NOT NULL auto_increment,
board_name char(16) NOT NULL,
board_manager char(20),
PRIMARY KEY (board_id)
);
oracle的结构:
CREATE TABLE PHP_ORACLE."BOARD"
("BOARD_ID" FLOAT,
"BOARD_NAME" CHAR(16) NOT NULL,
"BOARD_MANAGER" CHAR(20)) ;

我们只测试了INSERT操作花的时间,对于select,并未作测试。
因为win32下只有PHP3才能连接oracle数据库,所以只测试了用PHP3连接oracle的性能。相
信在PHP4的正式版本出来后,用PHP4连接oracle的速度应该有所提升。
而在LINUX下,因为我没有装oracle,所以只测试了mysql的性能。据说在LINUX下,oracle
的性能不错,只是无法测试。
并且我们将所有的用于数据库连接和oracle用来分析sql语句的代码都放在了统计代码之外
,所以测试得出的时间只是用于执行SQL操作所花费的时间。

用来测试mysql的程序:

<?php
$dblink=mysql_connect("localhost","root","shh123");
mysql_select_db("bbs");
$counter=1;
set_time_limit(300);
$query="insert into board (board_name,board_manager) values ('test','test')";
$begin_time=time();
for ($i=1;$i<=10000;$i ){
mysql_db_query("bbs",$query);
$counter ;
}
$end_time=time();
mysql_close($dblink);
echo "test db speed...<br>";
echo "begin time:".$begin_time."<BR>";
echo "<BR>end time:".$end_time."<BR>";

以前没学过PHP,最近刚好一个项目需要用到,我就决定一边学一边做PHP.
1 在SQL语句中可通过添加限制条件:left(text,20)只取text文本的前20个字;
2 可以用limit fromRecord, RecordNum 来作为分页使用,比如limit 0,30表示从第一个记录开始遍历30个纪录;
3 两个表的连接可以是:table1 join table2 using x(x为两个表的公共字段),或者是table1 join table2 on table1.x = table2.x
4 php获取querystring可以用$page = $_GET['page'];
或者
$page = $_REQUEST['page'];
其中Request可取得post,get,QueryString等字符;
在这之前 我看到了一个较笨的办法:
parse_str($_SERVER['QUERY_STRING'],$output); // 先将查询字符串存到一个数组$output中
$page = $output['page']; //然后根据变量名索引

5 php中日期函数的比较实际上就是字符串的比较;
6 mysql中date类型的数据可以是:2000-02-03,2002.02.03,2002.2.3,02.02.03,02.2.3,就是说必须有月和日,而且必须以'-'或'.'分隔开来。
7 data()来获取时间会有时区的问题,我发现时间都少了8个小时,是因为php.ini里面默认配置是GTM美国时区;
解决办法:可以修改php.ini:
[Date]
; Defines the default timezone used by the date functions
date.timezone = "Asia/Shanghai"
或者在使用date()函数是加上date_Default_TimeZone_set("PRC");

8 一段时间,调试时在body处总是说我缺少")",费了半天是intval($_POST['consumeType'])的问题,在数据库中该字段是varchar(50),在zengsong表中我没用intval函数,是因为它的ID就是1,2...整数跟char型的可以互相转换,但在另外两个表中是A5A,SP07-01之类的,但它怎么转换成int型了呢?
让我们来看看intval函数的声明:
intval函数用来获取变量的整数值:int intval ( mixed var [, int base] )
通过使用特定的进制转换(默认是十进制),返回变量 var 的 integer 数值。
var 可以是任何标量类型。intval() 不能用于 array 或 object。

9 另外一个莫名的问题,以用户名1登陆就可以,换个'bo'登陆,系统就在<body>处出错:说我运行时间错误:缺少")",nnd。检查了一下,原来是sql语句中的变量类型跟数据库中的不一致,
10 php中当从浮点数转换成整数时,数字将被取整(丢弃小数位)。

11 在mysql插入语句中,假如是自增字段要用(NULL)来代替。
12 php的中文乱码???问题解决:
在mysql_connect后加入mysql_query("set names 'gb2312'");
或者全用utf8编码,就不用加入上述语句了。
还有函数iconv("GBK","UTF8","字符串");可实现各种字符编码的转换。

做所有这些事情的一个更好办法是将数据加载到一个数据库中,然后执行查询,比如下面的查询。

  清单 9. Getfiles_good.php

<?php
require_once("DB.php");

function get_files( $name )
{
 $rows = array();

 $dsn = 'mysql://root:password@localhost/good_multi';
 $db =& DB::Connect( $dsn, array() );
 if (PEAR::isError($db)) { die($db->getMessage()); }

 $res = $db->query("SELECT files.* FROM users, files WHERE
users.login=? AND users.id=files.user_id",
array( $name ) );
 while( $res->fetchInto( $row ) ) { $rows[] = $row; }

 return $rows;
}

$files = get_files( 'jack' );

var_dump( $files );
?>

  该代码不仅更短,而且也更轻易理解和高效。我们不是执行两个查询,而是执行一个查询。

  尽管该问题听起来有些牵强,但是在实践中我们通常总结出所有的表应该在同一个数据库中,除非有非常迫不得已的理由。

  问题 4:不使用关系

  关系数据库不同于编程语言,它们不具有数组类型。相反,它们使用表之间的关系来创建对象之间的一到多结构,这与数组具有相同的效果。我在应用程序中看到的一个问题是,工程师试图将数据库当作编程语言来使用,即通过使用具有逗号分隔的标识符的文本字符串来创建数组。请看下面的模式。

  清单 10. Bad.sql

DROP TABLE IF EXISTS files;
CREATE TABLE files (
 id MEDIUMINT,
 name TEXT,
 path TEXT
);

DROP TABLE IF EXISTS users;
CREATE TABLE users (
 id MEDIUMINT,
 login TEXT,
 password TEXT,
 files TEXT
);

INSERT INTO files VALUES ( 1, 'test1.jpg', 'media/test1.jpg' );
INSERT INTO files VALUES ( 2, 'test1.jpg', 'media/test1.jpg' );
INSERT INTO users VALUES ( 1, 'jack', 'pass', '1,2' );

  系统中的一个用户可以具有多个文件。在编程语言中,应该使用数组来表示与一个用户相关联的文件。在本例中,程序员选择创建一个 files 字段,其中包含一个由逗号分隔的文件 id 列表。要得到一个特定用户的所有文件的列表,程序员必须首先从用户表中读取行,然后解析文件的文本,并为每个文件运行一个单独的 SELECT 语句。该代码如下所示。

  清单 11. Get.php

<?php
require_once("DB.php");

前言:

  PHP中对各类数据库的操作有着支持,对文件的操作也同样有着很丰富的操作方法,很多朋友现在的操作还是基于文件操作可是有的时候在操作文件的时候还存在不少的困惑和疑点,以下是我在日常编写过程中碰到的以及坛上朋友所碰到的关于文件操作的一些问题收藏吧。

  问:如何新建一个文件?

  答:

  1、使用fopen("要建立的文件名","参数"),参数可选w,w ,a,a

  2、使用exec("echo '' > 要建立的文件名");这样是使用系统方式建立这个文件,你还可以使用touch这个linux命令来建立

  问:为什么我无法建立文件?

  答:

  1、假如你使用了fopen建立文件,是否正确的使用了参数

  2、系统权限问题,请询问你的WEBMASTER你的FTP目录是否有写的权限

  3、FTP权限问题,你要确认你的PHP文件所要写文件所在目录要有写的权限,也就是你的FTP软件登陆后other组要有写这个权限,

  假如没有请修改权限后尝试

  问:如何将文件读入数组?

  答:使用file函数

  问:如何将文件全部读出?

  答:

   

    1、使用fread($fp);

  2、假如你的PHP版本>=4.3.0的话可以使用file_get_contents();

  问:如何判定文件是否存在?

  答:使用file_exists();

  再问:为什么不使用fopen()来判定呢?

  答:原因是有时候是因为权限问题导致fopen返回的数据引导我们错误的判定

  问:为什么当我读取一个WEB页面的时候出错?

  答:

  1、可能是你的传递参数错,当读取WEB页面的时候你只可以使用r方式读取页面

  2、确保你要读取的WEB页面可以访问


问:我如何才能获得文件的相关属性?

  答:PHP提供了一组获得文件属性的方法,例如 filemtime(),fileowner(),filegroup(),filectime(),fileatime()...具体的使用请参阅手册。

  问:PHP打开文件后是否可以象C一样进行文件“游标”的定位呢?

  答:可以的,使用fseek();

  问:我想在访问文件的时候不答应其他人也访问此文件,怎么办?

  答:

  1、你可以采用其他方面程序限制用户接入文件操作的页面

  2、使用flock();具体的参数以及使用方法请参阅手册

  问:如何删除文件内第一行,或指定一行数据?

  答:

  PHP并没有提供这样的操作方法,不过我们可以通过组合使用,以下代码演示我们将删除文件"test.dat"中的第三行数据(test.dat 文件中数据不止三行)

[!--infotagslink--]

相关文章

  • JavaScript模版引擎的基本实现方法浅析

    这篇文章主要介绍了JavaScript模版引擎的基本实现方法,讲解利用function对象来一步步编写简单的模板,需要的朋友可以参考下...2016-02-18
  • 模板引擎smarty工作原理以及使用示例

    模板引擎是用于把模板文件和数据内容合并在一起的程序,便于网站开发有利于代码分离和维护,了解一个模板最好知道其工作原理,以便于实现一通万通。模板文件一般是HTML xml js等类型文件,如果不用模板引擎若要把数据显示在...2014-05-31
  • Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解

    这篇文章主要介绍了Zend Framework动作助手(Zend_Controller_Action_Helper)用法,详细分析了动作助手Zend_Controller_Action_Helper功能,定义,使用方法与相关实现代码,需要的朋友可以参考下...2016-03-10
  • Zend Framework动作助手Redirector用法实例详解

    这篇文章主要介绍了Zend Framework动作助手Redirector用法,结合实例形式详细分析了转向器Redirector的功能,使用方法与相关注意事项,需要的朋友可以参考下...2016-03-10
  • 怎样在CocosCreator中使用物理引擎关节

    这篇文章主要介绍了怎样在CocosCreator中使用物理引擎关节,对物理引擎感兴趣的同学,着重要看一下...2021-04-16
  • IIS下Zend 出现 Unable to view file mapping 问题的解决方法汇总

    这篇文章主要介绍了IIS下Zend 出现 Unable to view file mapping 问题的解决方法汇总,需要的朋友可以参考下...2016-01-27
  • Mysql存储引擎MyISAM的常见问题(表损坏、无法访问、磁盘空间不足)

    这篇文章主要介绍了Mysql存储引擎MyISAM的常见问题,针对表损坏、无法访问、磁盘空间不足等问题进行解决,感兴趣的小伙伴们可以参考一下...2016-05-20
  • 网站被搜索引擎降权有效处理方法

    网站被搜索引擎教程降权,从多个方面可以看得出来,例如网站收录数量减少,首页不在第一位,关键词排名下降等。被降权的原因涉及很多的因素,在此不再列举,下面千盟网络主要谈一...2016-10-10
  • 如何避免被搜索引擎视为作弊

      一个网站要想成功注册,它起码应具备两个条件,一是网站本身要有较好的内容和设计,二是网站没有作弊行为。这里所谓的“作弊”,是指采用一些特殊的、有悖常规的网...2016-09-20
  • C++实现的分布式游戏服务端引擎KBEngine详解

    这篇文章主要详细介绍了C++实现的分布式游戏服务端引擎KBEngine的概念以及使用方法,非常的实用,有需要的小伙伴可以参考下...2020-04-25
  • Zend Framework动作助手Json用法实例分析

    这篇文章主要介绍了Zend Framework动作助手Json用法,结合实例形式分析了Zend Framework动作助手Json的功能与相关使用技巧,需要的朋友可以参考下...2016-03-10
  • MySQLMerge存储引擎

    MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询。本文给大家介绍MySQLMerge存储引擎,需要的朋友参考下吧...2016-03-27
  • Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解

    这篇文章主要介绍了Zend Framework教程之请求对象的封装Zend_Controller_Request用法,结合实例形式详细分析了请求对象封装的原理,使用方法与相关注意事项,需要的朋友可以参考下...2016-03-10
  • Zend Framework教程之配置文件application.ini解析

    这篇文章主要介绍了Zend Framework教程之配置文件application.ini用法,分析了配置文件application.ini中常见的配置项含义及用法,需要的朋友可以参考下...2016-03-12
  • NoahWeb?引擎介绍

    NoahWeb&#8482;引擎为计算机编程专用语言解析引擎,属于新一代解析型编程语言执行引擎,用于快速开发B/S结构下的应用或网站。同NoahWeb&#8482;紧密相关的有NoahWeb...2016-09-20
  • Zend Framework教程之模型Model基本规则和使用方法

    这篇文章主要介绍了Zend Framework教程之模型Model基本规则和使用方法,结合实例形式详细分析了Zend Framework中模型的原理与具体使用技巧,需要的朋友可以参考下...2016-03-07
  • 初学者入门:细述PHP4的核心Zend

    一.概述: Zend引擎的名称由Zeev Suraski和Andi Gutmans二位在PHP担任核心开发工作的资深设计师的名字合体.开发的目的师为了研发新的脚本执行机制,而PHP4就是这套崭新...2016-11-25
  • Zend Framework数据库操作方法实例总结

    这篇文章主要介绍了Zend Framework数据库操作方法,结合实例形式总结分析了Zend Framework数据库操作相关函数使用技巧与注意事项,需要的朋友可以参考下...2017-01-08
  • 关于网站改版各搜索引擎的反应分析

    下面言归正传,介绍下网站改版后,搜索引擎的更新反应速度,希望大家能学到一些经验。   测试搜索引擎反应速度的前提如下:   1、网站有定量的外链,什么意思呢,就是网站有一...2016-10-10
  • 获取关键词及所属来源搜索引擎名称

    原理是从url中提取关键词。参数说明:url及关键词前的字符,然后进行处理与来源判断是那个搜索引擎,这样保存到数据就就行了。 <?php教程 // $search_url = isset($_get['...2016-11-25