PHP 5/Zend Engine 2.0µÄ¸Ä½ø |
| ×÷Õߣºitzn.com¡¡·¢²¼Ê±¼ä£º2008-01-31 00:14:27¡¡À´Ô´£º»¥ÁªÍø |
½üÁ½ÄêûÓÐʹÓÃPHPд¹ý³ÌÐòÁË,½ñÌìÒªÓÃPHP,¾ÍÔÚÍøÉϲéÁ˲飬¿´µ½ÁËPHP5£¬Ò»Ê±Ö®¼äÐËȤÓÖ´óÁËÆðÀ´£¬ÓÚÊÇ·ÒëÁËÕâÆªÎÄÕ¡£ ÎÄÕÂÀ´Ô´ÓÚhttp://www.php.net/¡£ еĶÔÏóÄ£ÐÍ PHPÖеĶÔÏó´¦Àí²¿·ÖÒÑÍêÈ«ÖØÐ´£¬¾ßÓиü¼ÑµÄÐÔÄܺ͸ü¶àµÄ¹¦ÄÜ¡£ÔÚÏÈǰµÄPHP°æ±¾ÖУ¬¶ÔÏó±»µ±×öÔʼµÄ¼òµ¥ÀàÐÍ £¨ÈçintegerºÍstring£©À´´¦Àí£¬ÕâÖÖ·½·¨µÄȱµãÊǵ±±äÁ¿±»¸³Öµ»ò×÷Ϊ²ÎÊý´«µÝʱ£¬µÃµ½µÄÊǶÔÏó¿½±´¡£¶øÔÚа汾ÖУ¬ ¶ÔÏóÊÇͨ¹ý¾ä±úÀ´ÒýÓõ쬶ø²»ÊÇͨ¹ý¶ÔÏóµÄÖµ£¨¾ä±úÏëÏóΪ¶ÔÏóµÄ±êʶ·û£©¡£ ºÜ¶àPHP³ÌÐòÔ±¿ÉÄÜδÒâʶµ½ÀϵĶÔÏóÄ£Ð͵ġ°copying quirks¡°£¬Òò´ËÒÔǰµÄ´ó¶àÊýPHP³ÌÐò½«²»ÐèÒª×öÈκθü¸Ä ¼´¿ÉÔËÐУ¬»òÖ»×öºÜÉٵĸ͝¡£
˽Óкͱ£»¤³ÉÔ± PHP 5Òý½øÁË˽Óкͱ£»¤³ÉÔ±±äÁ¿£¬ËüÃÇ¿ÉÒÔ¶¨Òå¿ÉÊÓ»¯µÄÀàÊôÐÔ¡£ ʾÀý ±£»¤³ÉÔ±±äÁ¿ÄÜÔÚ¸ÃÀàµÄ×ÓÀàÖб»·ÃÎÊ£¬¶øË½ÓгÉÔ±±äÁ¿Ö»ÄÜÔÚËùÊôÀàÖб»·ÃÎÊ¡£ <?phpclass 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; /* ²»Êä³öÈκÎÄÚÈÝ£¬ÒÔÏÂÀàͬ */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./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»¹ÒýÈëÁ˳éÏóÀàºÍ·½·¨¡£³éÏó·½·¨Ö»ÉùÃ÷·½·¨µÄ¡±·ûºÅ¡±£¬¶ø²»ÌṩËüµÄʵÏÖ¡£Ò»¸ö°üº¬³éÏó·½·¨µÄÀàÐèÒªÉùÃ÷Ϊ¡±abstract¡±¡£ ÀýÈ磺 <?phpabstract class AbstractClass { abstract public function test();}class ImplementedClass extends AbstractClass { public function test() { echo "ImplementedClass::test() called./n"; }}$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 . "/n";
$obj = $obj->__clone();
print $obj->id . "/n"; print $obj->name . "/n"; print $obj->address . "/n"; ?>
ͳһµÄ¹¹Ôì·½·¨ ZENDÒýÇæÔÊÐí¿ª·¢Õß¶¨ÒåÀàµÄ¹¹Ôì·½·¨¡£¾ßÓй¹Ôì·½·¨µÄÀàÔÚн¨Ê±»áÊ×Ïȵ÷Óù¹Ôì·½·¨£¬¹¹Ôì ·½·¨ÊÊÓÃÓÚÔÚÕýʽʹÓøÃÀàǰ½øÐеijõʼ»¯¡£ ÔÚPHP4ÖУ¬¹¹Ôì·½·¨µÄÃû³ÆÓëÀàÃûÏàͬ¡£ÓÉÓÚÔÚÅÉÉúÀàÖе÷Óø¸ÀàµÄ×÷·¨±È½ÏÆÕ±é£¬Òò´Ëµ¼ÖÂÔÚ PHP4Öе±ÀàÔÚÒ»¸ö´óÐ͵ÄÀà¼Ì³ÐÖнøÐÐÒÆ¶¯Ê±£¬´¦Àí·½Ê½Óе㱿׾¡£µ±Ò»¸öÅÉÉúÀà±»ÒÆ¶¯µ½Ò»¸ö²»Í¬ µÄ¸¸ÀàÖÐʱ£¬¸¸ÀàµÄ¹¹Ôì·½·¨Ãû±ØÈ»ÊDz»Í¬µÄ£¬ÕâÑùµÄ»°ÅÉÉúÀàÖеÄÓйص÷Óø¸À๹Ôì·½·¨µÄÓï¾äÐèÒª¸Äд¡£ PHP5ÒýÈëÁËÒ»¸ö¶¨Òå¹¹Ôì·½·¨µÄ±ê×¼·½Ê½£¬Í¨¹ýµ÷ÓÃËüÃǵÄ__construct()À´¶¨Òå¡£ ʾÀý£º <?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ÒÑÖ§³Ö×¢²áÔÚÇëÇó½áÊøÊ±ÐèÒªÔËÐеĺ¯Êý¡£ 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 ÒýÈëÁËÀà³£Á¿£¨per-class constants£©¶¨Ò壺 <?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¡±¹Ø¼ü×Ö£¬ µ«ÎÞÐèÐ޸ľͿÉÒÔÔËÐС£
Òì³£(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/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(); ?>
¾²Ì¬ÀàÖеľ²Ì¬³ÉÔ±±äÁ¿¿É³õʼ»¯ ÀýÈ磺 <?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¡°¹Ø¼ü×ÖÀ´È·¶¨Ò»¸ö¶ÔÏóÊÇ·ñÊÇijһ¸ö¶ÔÏóµÄʵÀý£¬»òijһ¸ö¶ÔÏóµÄÅÉÉú£¬»òʹÓÃÁËijһ¸ö½Ó¿Ú¡£
ʾÀý£º
<?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]/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); ?>
|
1
2
|
|