愤怒的大鸟 发表于 2015-2-16 00:28:32

PHP网站制作之PHP 5昨天盛大推出--PHP 5/Zend Engine...

你的留言本应该加入注册以及分页功能了,而如果你更强的话,UI(用户界面)也可以加强,完成之后,感觉是不是特有成就感?不管怎么样,咱好歹是写了一个动态网站程序了,放在自己的网站上耍耍吧。   媒介

   明天俄然想到PHP官方网站上一转,一眼就看到PHP5推出的公告。固然之前看到过PHP5的预告,但仍是细心看了PHP 5/Zend Engine 2.0新特征一文,一股JAVA气味劈面而来...
   特将该文试译出来,首发于CSDN网站,以飨读者。

PHP 5/Zend Engine 2.0新特征
徐唤春 译 sfwebsite@hotmail.com
http://www.php.net/zend-engine-2.php

全新的对象模子
PHP中的对象处置局部已完整重写,具有更佳的功能和更多的功效。在PHP的之前版本中,对象与内建变量类型(如integer和string)的处置办法不异,其坏处是当变量被赋值为对象或对象作为参数传递时,失掉的是对象复成品。而在新版本中,对象经由过程句柄停止援用,而不是经由过程它的值。(句柄可以认是为是对象的标识符)
良多PHP法式员能够未意想到之前的对象模子的“复制怪癖”,因而之前的PHP法式将不需求做任何更改,或只做很小的修改便可运转
公有和回护成员
PHP 5引入了公有和回护成员变量,它们可以界说类属性在什么时候可以被会见。

类的回护成员变量能在该类的扩大类中被会见,而公有成员变量只能在本类中被会见。
<?php
class MyClass {
    private $Hello = "Hello, World!\n";
    protected $Bar = "Hello, Foo!\n";
    protected $Foo = "Hello, Bar!\n";

    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;/* Shouldn't print out anything */
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)中,还引入了公有和回护办法。
例:
<?php
class Foo {
    private function aPrivateMethod() {
      echo "Foo::aPrivateMethod() called.\n";
    }

    protected function aProtectedMethod() {
      echo "Foo::aProtectedMethod() called.\n";
      $this->aPrivateMethod();
    }
}

class Bar extends Foo {
    public function aPublicMethod() {
      echo "Bar::aPublicMethod() called.\n";
      $this->aProtectedMethod();
    }
}

$o = new Bar;
$o->aPublicMethod();
?>
之前代码中的用户自界说类或办法中虽不决义"public," "protected" 或 "private"等关头字,但无需编纂便可运转。
笼统类和办法
PHP 5还引入了笼统类和办法。笼统办法只声明办法界说, 不供实践运转。包括笼统办法的类需求声明为笼统类。
例:
<?php
abstract class AbstractClass {
    abstract public function test();
}

class ImplementedClass extends AbstractClass {
    public function test() {
      echo "ImplementedClass::test() called.\n";
    }
}

$o = new ImplementedClass;
$o->test();
?>
笼统类不克不及实例化。之前代码中的用户自界说类或办法中虽不决义"abstract”关头字,但无需编纂便可运转。
接口
ZEND引擎2.0引入了接口。一个类可以运转恣意的接口列表。
Example
例:
<?php
interface Throwable {
    public function getMessage();
}

class Exception implements Throwable {
    public function getMessage() {
    // ...
}
?>
之前代码中的用户自界说类或办法中虽不决义"interface”关头字,但无需编纂便可运转。
类类型界说
在保存类无需界说类型的同时,PHP 5引入了类类型界说来声明但愿把哪一个类经由过程参数传递给一个办法。
Example
例:
<?php
interface 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);
?>
这些类类型界说在不象一些需求类型预界说的言语在编译中停止反省,而是在运转时停止。这意味着:
<?php
function foo(ClassName $object) {
    // ...
}
?>
等价于:
<?php
function foo($object) {
    if (!($object instanceof ClassName)) {
      die("Argument 1 must be an instance of ClassName");
    }
}
?>
本语法只用于对象或类,不合用于内建类型。

final
PHP 5引入了“final”关头字界说在子类中不克不及被掩盖的成员或办法。
例:
<?php
class Foo {
    final function bar() {
      // ...
    }
}
?>
之前代码中的用户自界说类或办法中虽不决义"final"关头字,但无需编纂便可运转。
对象克隆
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 . "\n";

$obj = $obj->__clone();

print $obj->id . "\n";
print $obj->name . "\n";
print $obj->address . "\n";
?>
一致的机关办法名
ZEND引擎答应开辟者界说类的机关办法。具有机关办法的类在新建时会起首挪用机关办法,机关办法合用于在正式利用该类行进行的初始化。
在PHP4中,机关办法的称号与类名不异。因为在派生类中挪用父类的作法对照广泛,因而招致在PHP4中当类在一个大型的类承继中停止挪动时,处置体例有点愚笨。当一个派生类被挪动到一个分歧的父类中时,父类的机关办法名必定是分歧的,如许的话派生类中的有关挪用父类机关办法的语句需求改写。
PHP 5 introduces a standard way of declaring constructor methods by calling them by the name __construct().
PHP5引入了办法名__construct()来界说机关办法。
Example
<?php
class BaseClass {
    function __construct() {
      print "In BaseClass constructor\n";
    }
}

class SubClass extends BaseClass {
    function __construct() {
      parent::__construct();
      print "In SubClass constructor\n";
    }
}

$obj = new BaseClass();
$obj = new SubClass();
?>
为向下兼容,PHP5当在类不克不及找到__construct()办法时,会经由过程老的办法也就是类名来查找机关办法。这意味着独一能够发生兼容性成绩的是在之前的代码中已利用了一个名为__construct()的办法名。
析构办法
界说析构办法是非常有效的。析构办法可以纪录调试信息,封闭数据库毗连,还有做其它的收尾任务。PHP4中并没有此机制,虽然PHP已撑持注册在恳求停止时需求运转的函数。
PHP 5 introduces a destructor concept similar to that of other object-oriented languages, such as Java: When the last reference to an object is destroyed the object's destructor, which is a class method name %__destruct()% that recieves no parameters, is called before the object is freed from memory.
PHP5引入了与其它面向对象言语如Java言语类似的析构办法:当最初一个该对象的援用被排除时,体系将会在该对象从内存中释放前挪用名为__destruct()的析构办法。
例:
<?php
class MyDestructableClass {
    function __construct() {
      print "In constructor\n";
      $this->name = "MyDestructableClass";
    }

    function __destruct() {
      print "Destroying " . $this->name . "\n";
    }
}

$obj = new MyDestructableClass();
?>
和机关办法类似,引擎将不挪用父类的析构办法,为挪用该办法,你需求在子类的析构办法中经由过程parent::__destruct()语句停止挪用。
常量
PHP 5 引入了类常量界说:
<?php
class Foo {
    const constant = "constant";
}

echo "Foo::constant = " . Foo::constant . "\n";
?>

PHP5答应常量中有表达式,但在编译经常量中的表达式将被盘算.,因而常量不克不及在运转中改动它的值。
<?php
class Bar {
    const a = 1<<0;
    const b = 1<<1;
    const c = a | b;
}
?>
之前代码中的用户自界说类或办法中虽不决义"const”关头字,但无需编纂便可运转。
破例
PHP 4 had no exception handling. PHP 5 introduces a exception model similar to that of other programming languages.
PHP4中无破例处置,PHP5援用了与其它言语类似的破例处置模子。
例:
<?php
class MyExceptionFoo extends Exception {
    function __construct($exception) {
      parent::__construct($exception);
    }
}

try {
    throw new MyExceptionFoo("Hello");
} catch (MyException $exception) {
    print $exception->getMessage();
}
?>
之前代码中的用户自界说类或办法中虽不决义'catch', 'throw' 和 'try'关头字,但无需编纂便可运转。
函数前往对象值
In PHP 4 it wasn't possible to dereference objects returned by functions and make further method calls on those objects. With the advent of Zend Engine 2, the following is now possible:
在PHP4中,函数不成能前往对象的值并对前往的对象停止办法挪用,经由过程ZEND引擎2中,这一切变得能够:
<?php
class Circle {
    function draw() {
      print "Circle\n";
    }
}
      
class Square {
    function draw() {
      print "Square\n";
    }
}

function ShapeFactoryMethod($shape) {
    switch ($shape) {
      case "Circle":
            return new Circle();
      case "Square":
            return new Square();
    }
}

ShapeFactoryMethod("Circle")->draw();
ShapeFactoryMethod("Square")->draw();
?>
静态类中的静态成员变量如今可初始化
Example
<?php
class foo {
    static $my_static = 5;
}

print foo::$my_static;
?>
静态办法
PHP5引入了关头字'static'来界说一个静态办法,如许可以从对象外停止挪用。
例:
<?php
class Foo {
    public static function aStaticMethod() {
      // ...
    }
}

Foo::aStaticMethod();
?>
虚拟变量$this在静态办法中有效。
instanceof
PHP5引入了关头字instanceof来肯定一个对象是不是是某一个对象的实例,或某一个对象的派生,或利用了某一个接口。
例:
<?php
class baseClass { }

$a = new baseClass;

if ($a instanceof basicClass) {
    echo "Hello World";
}
?>
静态函数变量
一切的静态变量如今在编译时停止处置,这答应开辟者经由过程援用来指定静态变量。这个变更进步了效力但意味着不成能对静态变量停止直接援用。
函数中经由过程按地址传送体例的参数答应界说默许值
例:
<?php
function my_function(&$var = null) {
    if ($var === null) {
      die("$var needs to have a value");
    }
}
?>
__autoload()
在初始化一个不决义的类时,引擎将主动挪用__autoload()拦阻器函数。该类名将作为__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]\n";

      if (isset($this->x[$nm])) {
            $r = $this->x[$nm];
            print "Returning: $r\n";
            return $r;
      } else {
            print "Nothing!\n";
      }
    }

    function __set($nm, $val) {
      print "Setting [$nm] to $val\n";

      if (isset($this->x[$nm])) {
            $this->x[$nm] = $val;
            print "OK!\n";
      } else {
            print "Not OK!\n";
      }
    }
}

$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:\n";
      var_dump($a);
      return $this->x;
    }
}

$foo = new Caller();
$a = $foo->test(1, "2", 3.4, true);
var_dump($a);
?>

参加PHP开发学习,或许只是一次偶然的想法吧!只是想在走向社会之前体验、学习在一个公司或者说是项目团队之中如何去更有效的沟通、交流、共同合作,还有就是为毕业实习找工作增加伐码。

变相怪杰 发表于 2015-2-16 04:05:37

再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。

不帅 发表于 2015-2-28 14:59:40

说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。

若相依 发表于 2015-3-4 03:44:51

真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,

只想知道 发表于 2015-3-11 02:00:12

有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。

谁可相欹 发表于 2015-3-13 06:47:38

找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。

飘灵儿 发表于 2015-3-20 15:25:53

其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。

再现理想 发表于 2015-4-1 07:09:36

首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。

分手快乐 发表于 2015-4-10 19:07:03

不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。

蒙在股里 发表于 2015-4-11 03:12:19

建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。

简单生活 发表于 2015-4-14 07:10:51

说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。

小妖女 发表于 2015-4-22 03:59:30

遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。

灵魂腐蚀 发表于 2015-4-22 05:07:53

要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。

海妖 发表于 2015-4-22 14:11:08

没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。

第二个灵魂 发表于 2015-5-5 13:42:12

为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。

精灵巫婆 发表于 2015-6-6 13:59:48

其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎

老尸 发表于 2015-6-9 00:11:02

装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。

小女巫 发表于 2015-7-8 13:58:55

如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,

再见西城 发表于 2015-7-8 21:03:36

学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
页: [1]
查看完整版本: PHP网站制作之PHP 5昨天盛大推出--PHP 5/Zend Engine...