您好,欢迎来到养宠指南。
搜索
您的当前位置:首页

PHP5/ZendEngine2的改进

2022-06-15 来源:养宠指南
摘要
php5主要在oop方面改进了PHP5使用了 Zend Engine 2,PHP4 是 Zend Engine 1可以支持 MYSQL 4.1.X 和 MYSQL 5.X.X (PHP4 不支持 4.0 之后的版本 ).更加OOP ,连 访问数据库都可以 OOP , 看来学好类是非常必要的!不在内嵌 MYSQL 库多作好多函数运行效率提高很多,本人发觉在数据库访问方面速度提高不少!PHP4与PHP5配置不同之处配置php4或者php5的过程中,php4,5的配置的步骤大致一样的,但是配置内容有一

新的对象模型 PHP中的对象处理部分已完全重写,具有更佳的性能和更多的功能。在先前的PHP版本中,对象被当做原始的简单类型 (如integer和string)来处理,这种方法的缺点是当变量被赋值或作为参数传递时,得到的是对象拷贝。而在新版本中, 对象是通过句柄来引用的,而不是通过对象的值(句柄想象为对象的标识符)。 很多PHP程序员可能未意识到老的对象模型的“copying quirks“,因此以前的大多数PHP程序将不需要做任何更改 即可运行,或只做很少的改动。 私有和保护成员 PHP 5引进了私有和保护成员变量,它们可以定义可视化的类属性。 示例 保护成员变量能在该类的子类中被访问,而私有成员变量只能在所属类中被访问。 <?phpclass MyClass { private $Hello = "Hello, World!"; protected $Bar = "Hello, Foo!"; protected $Foo = "Hello, Bar!"; function printHello() { print "MyClass::printHello() " . $this->Hello; print "MyClass::printHello() " . $this->Bar; print "MyClass::printHello() " . $this->Foo; } } class MyClass2 extends MyClass { protected $Foo; function printHello() { MyClass::printHello(); /* Should print */ print "MyClass2::printHello() " . $this->Hello; /* Shouldn't print out anything */ print "MyClass2::printHello() " . $this->Bar; /* Shouldn't print (not declared)*/ print "MyClass2::printHello() " . $this->Foo; /* Should print */ } } $obj = new MyClass(); print $obj->Hello; /* 不输出任何内容,以下类同 */ print $obj->Bar; /* Shouldn't print out anything */ print $obj->Foo; /* Shouldn't print out anything */ $obj->printHello(); /* Should print */ $obj = new MyClass2(); print $obj->Hello; /* Shouldn't print out anything */ print $obj->Bar; /* Shouldn't print out anything */ print $obj->Foo; /* Shouldn't print out anything */ $obj->printHello(); ?> 私有和保护方法 PHP 5(ZEND引擎2)中,私有方法和保护方法也被引入。 示例: <?phpclass Foo { private function aPrivateMethod() { echo "Foo::aPrivateMethod() called."; } protected function aProtectedMethod() { echo "Foo::aProtectedMethod() called."; $this->aPrivateMethod(); } } class Bar extends Foo { public function aPublicMethod() { echo "Bar::aPublicMethod() called."; $this->aProtectedMethod(); } } $o = new Bar; $o->aPublicMethod(); ?> 以前代码中的用户自定义类或方法中虽然没有定义"public," "protected" 或 "private"等关键字,但无需修改即可运行。 抽象类和方法 PHP 5还引入了抽象类和方法。抽象方法只声明方法的”符号”,而不提供它的实现。一个包含抽象方法的类需要声明为”abstract”。 例如: <? phpabstract class AbstractClass { abstract public function test(); } class ImplementedClass extends AbstractClass { public function test() { echo "ImplementedClass::test() called."; } } $o = new ImplementedClass;$o->test(); ?> 抽象类不能实例化。 旧的代码中的用户自定义类或方法中虽未定义"abstract”关键字,但无需修改就可以运行。 接口(Interfaces) ZEND引擎2.0引入了接口。一个类可以实现任意的接口列表。 例如: <?phpinterface Throwable { public function getMessage();}class Exception implements Throwable { public function getMessage() { // ...}?> 旧的代码中的用户定义类或方法中虽然没有定义"interface”关键字,但无需修改就可以正常运行。 类类型提示(Class Type Hints) 在保留类无需定义类型的同时,PHP 5引入了类类型提示来声明,以期望把对象的类通过参数传递给一个方法。 例如: <?phpinterface Foo { function a(Foo $foo);}interface Bar { function b(Bar $bar);}class FooBar implements Foo, Bar { function a(Foo $foo) { // ... } function b(Bar $bar) { // ... }}$a = new FooBar;$b = new FooBar;$a->a($b);$a->b($b);?> 这些类类型提示不是象一些需要类型定义的语言那样在编译中进行检查,而是在运行时进行检查。这就意味着: <?phpfunction foo(ClassName $object) { // ...}?> is equivalent to: <?phpfunction foo($object) { if (!($object instanceof ClassName)) { die("Argument 1 must be an instance of ClassName"); }}?> 这种语法只用于对象或类,不适用于内建(built-in)类型。 Final关键字(final) PHP 5引入了“final”关键字以定义在子类中不能被覆盖的成员或方法。 例: <?php class Foo { final function bar() { // ... }}?> 以前所写代码中的用户自定义类或方法中虽未定义"final"关键字,但无需修改就可以运行了。 对象克隆(Object Cloning) PHP 4在对象被复制时,用户不能判断运行那个拷贝构造函数。在复制时,PHP 4根据对象的属性 一位一位地复制一个同样的复制品。 每次都要建立一个完全一样的复制品并不总是我们想要的。一个很好的复制构造例子是,当有 一个代表一个GTK窗口的对象,它拥有该窗口的所有资源,当你建立一个拷贝时,你可能需要一 个新的窗口,它拥有原窗口的所有属性,但需要拥有新窗口的资源。另外一个例子是你有一个 对象引用了另外一个对象,当你复制父对象时,你希望建立那个引用对象的新实例,以使复制品有一个单独的拷贝。 对一个对象的拷贝通过调用对象的__clone()方法完成: <?php $copy_of_object = $object->__clone(); ?> 当开发者请求建立一个对象的新的拷贝时,ZEND引擎会检查是否已经定义了__clone()方法。如果未定义 的话,它会调用一个默认的__clone()方法来复制该对象的所有属性。如果定义了该方法,该方法会负责 在拷贝中设置必要的属性。为使用方便,引擎会提供一个函数从源对象中导入所有的属性,这样它就可 以先得到一个具有值的源对象拷贝,然后只需要对需要改变的属性进行覆盖即可。 例: <?php class MyCloneable { static $id = 0; function MyCloneable() { $this->id = self::$id++; } function __clone() { $this->name = $that->name; $this->address = "New York"; $this->id = self::$id++; } } $obj = new MyCloneable(); $obj->name = "Hello"; $obj->address = "Tel-Aviv"; print $obj->id . ""; $obj = $obj->__clone(); print $obj->id . ""; print $obj->name . ""; print $obj->address . ""; ?> 统一的构造方法 ZEND引擎允许开发者定义类的构造方法。具有构造方法的类在新建时会首先调用构造方法,构造 方法适用于在正式使用该类前进行的初始化。 在PHP4中,构造方法的名称与类名相同。由于在派生类中调用父类的作法比较普遍,因此导致在 PHP4中当类在一个大型的类继承中进行移动时,处理方式有点笨拙。当一个派生类被移动到一个不同 的父类中时,父类的构造方法名必然是不同的,这样的话派生类中的有关调用父类构造方法的语句需要改写。 PHP5引入了一个定义构造方法的标准方式,通过调用它们的__construct()来定义。 示例: <?php class BaseClass { function __construct() { print "In BaseClass constructor"; } } class SubClass extends BaseClass { function __construct() { parent::__construct(); print "In SubClass constructor"; } } $obj = new BaseClass(); $obj = new SubClass(); ?> 为向后兼容,当PHP5类不能找到__construct()方法时,会通过老的方法也就是类名 来查找构造方法。这意味着唯一可能产生兼容性问题的是在以前的代码中已经使用了 一个名为__construct()的方法名。 析构方法 定义析构方法是十分有用的。析构方法可以记录调试信息,关闭数据库连接,还有做其它的扫尾 工作。PHP4中并无此机制,尽管PHP已支持注册在请求结束时需要运行的函数。 PHP5引入了与其它面向对象语言如Java语言相似的析构方法:当最后一个该对象的引用被清除时, 系统将会在该对象从内存中释放前调用名为__destruct()的析构方法。 示例: <?php class MyDestructableClass { function __construct() { print "In constructor"; $this->name = "MyDestructableClass"; } function __destruct() { print "Destroying " . $this->name . ""; } } $obj = new MyDestructableClass(); ?> 和构造方法相似,引擎将不调用父类的析构方法,为调用该方法,你需要在子 类的析构方法中通过parent::__destruct()语句进行调用。 常量 PHP 5 引入了类常量(per-class constants)定义: <?php class Foo { const constant = "constant"; } echo "Foo::constant = " . Foo::constant . ""; ?> PHP5允许常量中包含表达式,但在编译时常量中的表达式将被计算, 因此常量不能在运行中改变它的值。 <?php class Bar { const a = 1<<0; const b = 1<<1; const c = a | b; } ?> 以前代码中的用户自定义类或方法中虽然未定义"const”关键字, 但无需修改就可以运行。 异常(Exceptions) PHP4中没异常处理,PHP5引入了与其它与语言相似的异常处理模型。 <?php class MyExceptionFoo extends Exception { function __construct($exception) { parent::__construct($exception); } } try { throw new MyExceptionFoo("Hello"); } catch (MyExceptionFoo $exception) { print $exception->getMessage(); } ?> 以前代码中的用户自定义类或方法中虽未定义'catch', 'throw' 和 'try'关键字,但无需修改 就可以运行。 函数返回对象值 在PHP4中,函数不可能返回对象的值并对返回的对象进行方法调用,随着Zend Engine 2 (ZEND引擎2)的出现,以下调用成为可能: <?php class Circle { function draw() { print "Circle"; } } class Square { function draw() { print "Square"; } } function ShapeFactoryMethod($shape) { switch ($shape) { case "Circle": return new Circle(); case "Square": return new Square(); } } ShapeFactoryMethod("Circle")->draw(); ShapeFactoryMethod("Square")->draw(); ?> 静态类中的静态成员变量可初始化 例如: <?php class foo { static $my_static = 5; } print foo::$my_static; ?> 静态方法(Static Methods) PHP5引入了关键字'static'来定义一个静态方法,这样可以从对象外进行调用。 例如: <?php class Foo { public static function aStaticMethod() { // ... } } Foo::aStaticMethod(); ?> 虚拟变量$this在被定义为静态(static)的方法中无效。 Instanceof PHP5引入了 “instanceof“关键字来确定一个对象是否是某一个对象的实例,或某一个对象的派生,或使用了某一个接口。 示例: <?php class baseClass { } $a = new baseClass; if ($a instanceof basicClass) { echo "Hello World"; } ?> 静态函数变量(Static function variables) 所有的静态变量现在在编译时进行处理,这允许开发者通过引用来指定静态变量。这个变化提高了效率但意味着不可能对静态变量进行间接引用。 函数中通过引用方式传递的参数允许有默认值 例如: <?php function my_function(&$var = null) { if ($var === null) { die("$var needs to have a value"); } } ?> __autoload() 在初始化一个未定义的类时,__autoload()拦截函数(interceptor function)将被自动调 用。类名将作为__autoload()拦截函数唯一参数传递给它。 例如: <?php function __autoload($className) { include_once $className . ".php"; } $object = new ClassName; ?> 方法和属性调用的重载 所有方法调用和属性访问都可以通用 __call(), __get() 和 __set()方法来重载。 例: __get() 和 __set() <?php class Setter { public $n; public $x = array("a" => 1, "b" => 2, "c" => 3); function __get($nm) { print "Getting [$nm]"; if (isset($this->x[$nm])) { $r = $this->x[$nm]; print "Returning: $r"; return $r; } else { print "Nothing!"; } } function __set($nm, $val) { print "Setting [$nm] to $val"; if (isset($this->x[$nm])) { $this->x[$nm] = $val; print "OK!"; } else { print "Not OK!"; } } } $foo = new Setter(); $foo->n = 1; $foo->a = 100; $foo->a++; $foo->z++; var_dump($foo); ?> 示例: __call() <?php class Caller { var $x = array(1, 2, 3); function __call($m, $a) { print "Method $m called:"; var_dump($a); return $this->x; } } $foo = new Caller(); $a = $foo->test(1, "2", 3.4, true); var_dump($a); ?>

小编还为您整理了以下内容,可能对您也有帮助:

php5和php4的区别

php5主要在oop方面改进了

PHP5使用了 Zend Engine 2,PHP4 是 Zend Engine 1
可以支持 MYSQL 4.1.X 和 MYSQL 5.X.X (PHP4 不支持 4.0 之后的版本 ).
更加OOP ,连 访问数据库都可以 OOP , 看来学好类是非常必要的!
不在内嵌 MYSQL 库
多作好多函数
运行效率提高很多,本人发觉在数据库访问方面速度提高不少!
PHP4与PHP5配置不同之处
配置php4或者php5的过程中,php4,5的配置的步骤大致一样的,但是配置内容有一些差别。在LINUX等环境下编译,一般来说,只要编译的选项正确,配置也就正确了;在windows配置则需要注意以下不同点:

1. php4ts.dll 和 php5ts.dll
这个文件要拷贝到apache的bin目录下或者系统目录下

2. httpd.conf 文件加载的模块
示例如下:
# For PHP4 + apache1.x.xx
LoadMole php4_mole d:/www/webserver/php4/sapi/php4apache.dll
AddType application/x-httpd-php .php

# For PHP4 + apache2.x.xx
LoadMole php4_mole d:/www/webserver/php4/sapi/php4apache2.dll
AddType application/x-httpd-php .php

# 其中d:/www/webserver/php4是php的所在目录。

# For PHP5 + apache1.x.xx
LoadMole php5_mole d:/www/webserver/php5/php5apache.dll
AddType application/x-httpd-php .php

# For PHP5 + apache2.x.xx
LoadMole php5_mole d:/www/webserver/php5/php5apache2.dll
AddType application/x-httpd-php .php

# 其中d:/www/webserver/php5是php的所在目录。

3. 加载 MySQL 的方式不同
在php4以及以前的版本中,mysql是集成在php中的;
而在PHP5(包括BETA)版本,mysql是作为一个模块加载的,需要设置php.ini来加载,例如
extension_dir = "D:/www/WebServer/PHP5/ext/"
extension=php_mysql.dll

另外,PHP4,PHP5都需要系统目录下的libmysql.dll的支持,如果版本不对,即使你设置了正确的extension_dir和php_mysql.dll的参数,也会造成apache启动的时候提示phpp_mysql.dll找不到的错误。

php5和php4的区别

php5主要在oop方面改进了

PHP5使用了 Zend Engine 2,PHP4 是 Zend Engine 1
可以支持 MYSQL 4.1.X 和 MYSQL 5.X.X (PHP4 不支持 4.0 之后的版本 ).
更加OOP ,连 访问数据库都可以 OOP , 看来学好类是非常必要的!
不在内嵌 MYSQL 库
多作好多函数
运行效率提高很多,本人发觉在数据库访问方面速度提高不少!
PHP4与PHP5配置不同之处
配置php4或者php5的过程中,php4,5的配置的步骤大致一样的,但是配置内容有一些差别。在LINUX等环境下编译,一般来说,只要编译的选项正确,配置也就正确了;在windows配置则需要注意以下不同点:

1. php4ts.dll 和 php5ts.dll
这个文件要拷贝到apache的bin目录下或者系统目录下

2. httpd.conf 文件加载的模块
示例如下:
# For PHP4 + apache1.x.xx
LoadMole php4_mole d:/www/webserver/php4/sapi/php4apache.dll
AddType application/x-httpd-php .php

# For PHP4 + apache2.x.xx
LoadMole php4_mole d:/www/webserver/php4/sapi/php4apache2.dll
AddType application/x-httpd-php .php

# 其中d:/www/webserver/php4是php的所在目录。

# For PHP5 + apache1.x.xx
LoadMole php5_mole d:/www/webserver/php5/php5apache.dll
AddType application/x-httpd-php .php

# For PHP5 + apache2.x.xx
LoadMole php5_mole d:/www/webserver/php5/php5apache2.dll
AddType application/x-httpd-php .php

# 其中d:/www/webserver/php5是php的所在目录。

3. 加载 MySQL 的方式不同
在php4以及以前的版本中,mysql是集成在php中的;
而在PHP5(包括BETA)版本,mysql是作为一个模块加载的,需要设置php.ini来加载,例如
extension_dir = "D:/www/WebServer/PHP5/ext/"
extension=php_mysql.dll

另外,PHP4,PHP5都需要系统目录下的libmysql.dll的支持,如果版本不对,即使你设置了正确的extension_dir和php_mysql.dll的参数,也会造成apache启动的时候提示phpp_mysql.dll找不到的错误。

php的发展史

PHP原始为Personal Home Page的缩写,已经正式更名为 "PHP: Hypertext Preprocessor"。注意不是“Hypertext Preprocessor”的缩写,这种将名称放到定义中的写法被称作递归缩写。PHP于1994年由Rasmus Lerdorf创建,刚刚开始是Rasmus Lerdorf 为了要维护个人网页而制作的一个简单的用Perl语言编写的程序。这些工具程序用来显示 Rasmus Lerdorf 的个人履历,以及统计网页流量。后来又用C语言重新编写,包括可以访问数据库。他将这些程序和一些表单直译器整合起来,称为 PHP/FI。PHP/FI 可以和数据库连接,产生简单的动态网页程序。

在1995年以Personal Home Page Tools (PHP Tools) 开始对外发表第一个版本,Lerdorf写了一些介绍此程序的文档。并且发布了PHP1.0!在这的版本中,提供了访客留言本、访客计数器等简单的功能。以后越来越多的网站使用了PHP,并且强烈要求增加一些特性。比如循环语句和数组变量等等;在新的成员加入开发行列之后,Rasmus Lerdorf 在1995年6月8日将 PHP/FI 公开发布,希望可以透过社群来加速程序开发与寻找错误。这个发布的版本命名为 PHP 2,已经有 PHP 的一些雏型,像是类似 Perl 的变量命名方式、表单处理功能、以及嵌入到 HTML 中执行的能力。程序语法上也类似 Perl,有较多的,不过更简单、更有弹性。PHP/FI加入了对MySQL的支持,从此建立了PHP在动态网页开发上的地位。到了1996年底,有15000个网站使用 PHP/FI。

ISAPI筛选器

在1997年,任职于 Technion IIT公司的两个以色列程序设计师:Zeev Surask

i 和 Andi Gutmans,重写了 PHP 的剖析器,成为 PHP 3 的基础。而 PHP 也在这个时候改称为PHP:Hypertext Preprocessor.[5]。经过几个月测试,开发团队在1997年11月发布了 PHP/FI 2。随后就开始 PHP 3 的开放测试,最后在1998年6月正式发布 PHP 3。Zeev Suraski 和 Andi Gutmans 在 PHP 3 发布后开始改写PHP 的核心,这个在1999年发布的剖析器称为 Zend Engine[7],他们也在以色列的 Ramat Gan 成立了 Zend Technologies 来管理 PHP 的开发。

在2000年5月22日,以Zend Engine 1.0为基础的PHP 4正式发布,2004年7月13日则发布了PHP 5,PHP 5则使用了第二代的Zend Engine[5]。PHP包含了许多新特色,像是强化的面向对象功能、引入PDO(PHP Data Objects,一个存取数据库的延伸函数库)、以及许多效能上的增强。PHP 4已经不会继续

PHP

更新,以鼓励用户转移到PHP 5。

2008年PHP 5成为了PHP唯一的有在开发的PHP版本。将来的PHP 5.3将会加入Late static binding和一些其他的功能强化。PHP 6 的开发也正在进行中,主要的改进有移除register_globals、magic quotes 和 Safe mode的功能。

PHP最新稳定版本:5.3.21(2013.1.17)

PHP最新发布版本:5.5.1(2013.7.18)修复了20个bug及其一些优化。

2013年6月20日,PHP开发团队自豪地宣布立即推出PHP 5.5.0。此版本包含了大量的新功能和bug修复。需要开发者特别注意的一点是不再支持 Windows XP 和 2003 系统。

养宠指南还为您提供以下相关内容希望对您有帮助:

php5和php4的区别

AddType application/x-httpd-php .php For PHP5 + apache2.x.xx LoadModule php5_module d:/www/webserver/php5/php5apache2.dll AddType application/x-httpd-php .php 其中d:/www/webserver/php5是php的所在目...

什么是PHP5

另外,PHP5中还改进了创建动态图片的功能,目前能够支持多种图片格式(如PNG、GIF、TTIF、JPGE等)。PHP5以及内置了对GD2库的支持,因此安装GD2库(主要指UNIX系统中)也不再是件难事,这使得处理图像十分简单和高效。大...

php的发展史

Zeev Suraski 和 Andi Gutmans 在 PHP 3 发布后开始改写PHP 的核心,这个在1999年发布的剖析器称为 Zend Engine[7],他们也在以色列的 Ramat Gan 成立了 Zend Technologies 来管理 PHP 的开发。在2000年5月22日,以Zen...

关于PHP5与PHP7的若干问题

PHP代码中创建的变量也进行了优化,PHP7直接在栈内存上预分配zval。这样节约了大量内存分配和内存管理的操作。2、zend_string存储hash值,array查询不再需要重复计算hash 3、PHP5的hashtable每个元素都是一个 Bucket ,而PHP7...

php的发展史

PHP 的开发小组有很多优秀的开发人员,同时还有大量的优秀人才在进行 PHP 相关工程的开发工作,如 PEAR 和 PHP 文档的工程。PHP 5 PHP 的未来主要受其核心,Zend Engine 控制。PHP 5 将包含新一代的 Zend Engine 2.0。

请问一下,php4与php5区别具体有哪些,哪个比较好,请详细回答我?_百度...

php5主要在oop方面改进了PHP5使用了 Zend Engine 2,PHP4 是 Zend Engine 1可以支持 MYSQL 4.1.X 和 MYSQL 5.X.X (PHP4 不支持 4.0 之后的版本 ).更加OOP ,连 访问数据库都可以 OOP不在内嵌 MYSQL 库多作好多函数运行效率...

PHP工程师的PHP发展历程

在2000年5月22日,以Zend Engine 1.0为基础的PHP 4正式释出,2004年7月13日则释出了PHP 5,PHP 5则使用了第二代的Zend Engine[5]。PHP包含了许多新特色,像是强化的面向对象功能、引PDO(PHPData Objects,一个...

PHP,Java,Python,C,C++ 这几种编程语言都各有什么特点或优点_百度知 ...

2. 语法简单,入门快,如果有其它语言基础的程序员二周左右的时间基本可以入门,并且跟ASP有部分类似。有成熟的开发工具,比如NuPHPed,或者Zend Studio等等,再Linux平台下可以使用Eclipse等等。3. 目前主流技术都支持,比如WebService、Ajax、...

求一篇php方面的英文论文,最好带中文翻译的!

2004年7月13日是一个让人激动的日子:PHP发布了人们翘首以待的PHP5.通过提出一个新的对象模型,再加上高级ZendII引擎更使之如虎添翼,PHP蓄势待发,要通过这个版本将OOP推向一个全新的高度。在更新、更强大的类结构和...

当今流行的PHP框架中各自都有什么特点,优缺点都在哪?

Comparison ChartFrameworkPHP4PHP5MVC1Multiple DB's2ORM3DB Objects4Templates5Caching6Validation7Ajax8Auth Module9Modules10Zend Framework---CakePHP--Symfony Project---Seagull Framework-WACT---Prado---PHP on TRAX--...

上一篇:新版PHP将向Java靠拢

下一篇:基于Vue自定义指令实现按钮级权限控制的方法

Top