½üÁ½ÄêûÓÐʹÓÃ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);
?>