PHP ????
?? ?? ?????(??: ?? ?? ?????, ??: OOP)?? ??? ??? ??? ???? ??? ?? ???? ??? ???? ?? ??? ??????. OOP? ????, ???, ?????? ????? ?????? ? ?? ??? ?????.
PHP? ?? 4.0 ?? OOP? ?? ??? ??????. ??? ??????? ?? ?? ?? ?????? ???? ?? ? ???? ???? ? ????. ??? ?? ??? ??????? ?? OOP? ???? ???.
???
???? ??? ??? ???? ?? ??? ?????. ?? ??? ????? ? ?? ?? ??? ???? ? ???? ??? ?? ??? ?? ??? ?? ??? ?????. ?? ?? ????? ???? ???? ???? ???? ???? ??? ??? ??? ?? ?? ??? ??? ????? ? ?? ?? ??? ???? ???.
??
??? ????? ???? ?? ???? ? ???? ?????. ???? ???? ?? ?????. ??? ?? ??? ?? ???? ???? ??? ???? ?????.
?? ???? ??? ???? ??? ???, ????, ??? ?? ?????.
??? ?? ? ?? ??:
??? ??: ??? ?? ??? ??? ? ???, ??? ?? ?? ?? ?????.
??? ??: ?? ???? ???? ? ??? ???? ??, ??, ??, ??.
??? ??: ??? ??? ???? ????, ?????? ??? ??? ????? ??? ????.
???? ??? ??
???? ??? ??? ??? ???? ??? ????. ???? ????? ??? ???? ??? ??????. ??? ??????.
?? ?? Animal? ?? ?? ??? ? ?? ?? ?????, ?? ?? ?? ??? ???, ??? ? ??, ?? ?? ??? ????.
?? ?? ???
??? - ??? ???? ??? ?????. ???? ???? ???? ??? ???? ?? ??? ?????.
Object - ???? ???????.
?? ?? - ??? ??? ??? ?????. ? ??? ?? ?? ???? ??? ??? ?? ??? ?? ???? ? ????. ???? ??? ??????? ??? ??? ????? ?? ? ????.
?? ?? - ??? ??? ???? ??? ??? ???? ????? ? ??? ? ????.
?? - ??? ?? ???? ?? ???? ??? ??? ???? ???? ???? ???????. ???? ???? ??? ? ?? ???? ???? ? ? ??, ?? ????? ??? ???? ??? ???? ???? ??? ???? ??? ? ????.
?? ??? - ???? ?? ???? ?? ?????. ? ???? ?? ???, ?? ??? ?? ?? ????? ? ? ????.
?? ??? - ?? ???? ???? ???? ?? ??? ?? ?? ????? ???.
???(Polymorphism) - ???? ??? ??, ?? ?? ????? ?? ??? ??? ???? ?? ?? ??? ?? ? ??? ?????. ??? ???? ??? ? ?? ?? ??? ?? ?? ??? ??? ? ?? ??? ?????? ???.
????(Overloading) - ??? ???, ??? ??? ???? ??? ?? ??? ???? ????? ?? ?? ????? ???.
??? - ???? ??? ??? ??(??)? ??(??)? ?? ??? ???? ????? ?? ????. ???? ?? ?? ???? ????? ??????? ??? ??? ??? ???? ??????. ?? ???? ??? ?????? ?? ?? ????? ????? ???.
???(Encapsulation) - ???? ?? ??? ???? ??? ??? ??? ??? ?? ??? ?? ?? ???? ?? ????.
??? - ?? ??? ??? ? ??? ????? ? ?????. ?, ?? ?? ??? ???? ???? ? ?????. ??? ???? ???? ?? new ???? ?? ?????.
??? - ???(???) ????? ??? ??? ????? ???(?? ?? ??? ??? ??? ??? ??) ???? ???? ???? ?????. ???? ?? "??" ??? ???? ? ?????(?? ?? ??? ??? ? new? ???? ??? ??? ???. ??? ??? ???? ?? ????? ??? ?? ????? ???).
?? ????? Car ???? ?? Mercedes, Bmw ? Audi?? ? ?? ??? ??????.
$mercedes = ? ???();
$bmw = ? ???()
$audi = ? ???()
>
class ???? ???? ???? ???? ? ?? ??? ??? ?? ??? ?????. {} ??? ?????.
??:
class class_name{......}
????? ??? ?? ??.
??? ???? var ???? ???? ??? ???? ???? ?? ?????? ?? ??? ??? ??? ? ????.
??:
class class_name{var $var_name }
????? ?? ?? ?? ?, ???? ???? ?????.
??:
??? ??? ??{
?? ?? ??(arg1,arg2,...)
{
?? ??
}
}
??? ???? ??? ???? ??? ?????, ????? ??? ?? ??? ??? ? ????. ??? ??? ??? ????? new ???? ???? ??? ????????. ?? ??? ??? ?????? ? ????.
??:
object = new class_name();
??? ?????? ? -> ?? ?? ? ???.
??:
object->var_name;
object->function_name;
??? ??? ?????? ?? class ???? ???? ?? ?? ?? $this? ??? ? ????. $this? ?? ??? ?? ??? ???? ? ?????.
<?php class Person { //人的成員屬性 var $name; //人的名字 var $age; //人的年齡 //人的成員 say() 方法 function say() { echo "我的名字叫:".$this->name." <br >"; echo "我的年齡是:".$this->age; } } //類定義結(jié)束 //實(shí)例化一個(gè)對象 $p1 = new Person(); //給 $p1 對象屬性賦值 $p1->name = "張三"; $p1->age = 20; //調(diào)用對象中的 say()方法 $p1->say(); ?>
? ??? ???? ??? ?????.
My name is: Zhang San
My age is: 20
Example
<?php class Site { /* 成員變量 */ var $url; var $title; /* 成員函數(shù) */ function setUrl($par) { $this->url = $par; } function getUrl() { echo $this->url . PHP_EOL; } function setTitle($par) { $this->title = $par; } function getTitle() { echo $this->title . PHP_EOL; } } $php = new Site; $taobao = new Site; $google = new Site; // 調(diào)用成員函數(shù),設(shè)置標(biāo)題和URL $php->setTitle( "php中文網(wǎng)" ); $taobao->setTitle( "淘寶" ); $google->setTitle( "Google 搜索" ); $php->setUrl( 'ipnx.cn' ); $taobao->setUrl( 'www.taobao.com' ); $google->setUrl( 'www.google.com' ); // 調(diào)用成員函數(shù),獲取標(biāo)題和URL $php->getTitle(); $taobao->getTitle(); $google->getTitle(); $php->getUrl(); $taobao->getUrl(); $google->getUrl(); ?>
???? ?? ??
? ??? ???? ?? ??? ??? ????.
php ?? ????
Taobao
Google ??
ipnx.cn
www.taobao.com
www.google.com
PHP ???
???? ??? ?????. ?? ??? ??? ? ??? ????? ? ?????. ?, ?? ?? ??? ???? ???? ? ?????. ??? ???? ???? ?? new ???? ?? ?????. new ???? ???? ???? ????? ???? ???? ???? ???? ?? ??? __construct()?? ???.
????? ??? ???? ??? ? ??? ??? ??? ?? ???? ?????. ?? ??? ??? ???? ?? ? ?? ?????. ? ???? ????? ??? ? ???? ????? ? ?? ??? ??? ??? ???? ? ?????. ? ????? ?? ?? ????.
??:
function __construct(arg1,arg2,...)
{
...
}
?? ???? ??? ???? ?? $url ? $title ??? ???? ? ????.
<?php
function __construct( $ par1, $par2 ) {
$this->url = $par1;
$this->title = $par2
}
?>
?? ? ?? setTitle ? setUrl ???? ??? ??? ????.
Instance
<?php $php = new Site('ipnx.cn', 'php中文網(wǎng)'); $taobao = new Site('www.taobao.com', '淘寶'); $google = new Site('www.google.com', 'Google 搜索'); // 調(diào)用成員函數(shù),獲取標(biāo)題和URL $php->getTitle(); $taobao->getTitle(); $google->getTitle(); $php->getUrl(); $taobao->getUrl(); $google->getUrl(); ?>
???? ???
Destructor
??? ???? ???? ??? ???? ???? ?? ??, ?? ?? ?? ?? ?? ???? ???? ?? ?? ??? ????? ?? ??? ??? ? ????. ???? ????? ??? ? ??? ??? __destruct() ?? ???.
PHP 5??? ?? ?? ?? ??? ??? ??? ??? ??????. ?? ??? ??? ????.
function __destruct()
{
......
}
Instance
<?php class MyDestructableClass { function __construct() { print "構(gòu)造函數(shù)\n"; $this->name = "MyDestructableClass"; } function __destruct() { print "銷毀 " . $this->name . "\n"; } } $obj = new MyDestructableClass(); ?>
? ??? ???? ?? ??? ??? ????.
???
Destroy MyDestructableClass
???? ???? ??? ????
<?php class Person { var $name; var $age; //定義一個(gè)構(gòu)造方法初始化賦值 function __construct($name,$age) { $this->name=$name; $this->age=$age; } function say() { echo "我的名字叫:".$this->name." <br >"; echo "我的年齡是:".$this->age." <br >";; } function __destruct() { echo "再見".$this->name; } } $p1=new Person("張三", 20); $p1->say(); ?>
? ??? ???? ?? ??? ??? ????.
? ??? Zhang San
??? 20
?? Zhang San
???
PHP ??? ??? ??? ?????. ??? ??? ?? ??? ????? ???? ???? ???? ? ???? ???? ?????? ???? ??? ?? ?? ?? ?? ??? ??? ? ?? ??? ?? ???? ??? ????.
? ???? ???? ? ???? ?? ???? ?? ????? ??, ?? ????? ??? ? ???? ?? ????? ???. ??? ????? ? ?? ?? ?? ? ?????.
?? ????? ?? ?? ??? ??? ???? ? ??? ??? ??? ? ????. ??? ? ??? ???? ?? ??? ???? ??? ?? ??? ?????.
??: Java? ?? ??? ?? PHP??? ???? ??? ???, ? ?? ????? ???? ?? ??? ? ????.
extends ???? ???? ??? ?? ??:
class subclass extends parent class {
}
Instance
????? Child_Site ???? Site ???? ???? ?? ??? ?????.
<?php // 子類擴(kuò)展站點(diǎn)類別 class Child_Site extends Site { var $category; function setCate($par){ $this->category = $par; } function getCate(){ echo $this->category . PHP_EOL; } } ?>
??? ???
?? ????? ??? ???? ??? ?? ??? ??? ? ?? ?? ?? ??? ?? ??? ?? ??? ? ????. ? ????? ??? ????? ?? ??? ??????? ???.
?????? getUrl ? getTitle ???? ?? ???????.
function getUrl() {
echo $this->php_EOL
return $this; - >url
}
function getTitle(){
echo $this->title . PHP_EOL;
return $this->title; >
??? ?? ? ???
?? PHP?? public, protected ?? private ??? ???? ???? ?????. ???? ???? ?? ??? ??.
??? ??? ???? ???? ???? OOP ??? ??? ??? ??? ?? ???? ??? ? ????.
PHP? ?? ? ?? ??? ???? ?????.
public(public): ???? ??? ??? ??? ??? ?? ?? ??? ? ???? ???(?? ? ??)? ? ????. ?? ?? ? ?? ??? ??). ??? ??? ?? ??? ???? ???? ??? ??? ?????.
protected: protected? ??? ??? ??? ??? ???? ???? ? ??? ???? ?? ????? ??? ??? ????.
????(private): private?? ??? ??? ?? ???? ?? ?? ??? ?? ??? ?????, ?? ???? ?? ?? ? ?????? ?? ??? ???? ???.
??? ??? ?? ???:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?: ?? ???? ?? ???? ???? ????? ?? ?? ???? ???? ?? ??? ??? ???? ?? ? ????. ?? ???? ???? ???? ?? ??? ??.
?? ??? ?? ??? ??? ??, ??, ??? ? ??? ????? ???. var? ???? ??? ?????.
<?php /** * Define MyClass */ class MyClass { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj = new MyClass(); echo $obj->public; // 這行能被正常執(zhí)行 echo $obj->protected; // 這行會產(chǎn)生一個(gè)致命錯(cuò)誤 echo $obj->private; // 這行也會產(chǎn)生一個(gè)致命錯(cuò)誤 $obj->printHello(); // 輸出 Public、Protected 和 Private /** * Define MyClass2 */ class MyClass2 extends MyClass { // 可以對 public 和 protected 進(jìn)行重定義,但 private 而不能 protected $protected = 'Protected2'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj2 = new MyClass2(); echo $obj2->public; // 這行能被正常執(zhí)行 echo $obj2->private; // 未定義 private echo $obj2->protected; // 這行會產(chǎn)生一個(gè)致命錯(cuò)誤 $obj2->printHello(); // 輸出 Public、Protected2 和 Undefined ?>???? ?? ??? ?????? ???? ??, ??? ?? ??? ??? ? ????. ??? ???? ???? ?? ?? ???? ????? public?? ?????.
<?php /** * Define MyClass */ class MyClass { // 聲明一個(gè)公有的構(gòu)造函數(shù) public function __construct() { } // 聲明一個(gè)公有的方法 public function MyPublic() { } // 聲明一個(gè)受保護(hù)的方法 protected function MyProtected() { } // 聲明一個(gè)私有的方法 private function MyPrivate() { } // 此方法為公有 function Foo() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); } } $myclass = new MyClass; $myclass->MyPublic(); // 這行能被正常執(zhí)行 $myclass->MyProtected(); // 這行會產(chǎn)生一個(gè)致命錯(cuò)誤 $myclass->MyPrivate(); // 這行會產(chǎn)生一個(gè)致命錯(cuò)誤 $myclass->Foo(); // 公有,受保護(hù),私有都可以執(zhí)行 /** * Define MyClass2 */ class MyClass2 extends MyClass { // 此方法為公有 function Foo2() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); // 這行會產(chǎn)生一個(gè)致命錯(cuò)誤 } } $myclass2 = new MyClass2; $myclass2->MyPublic(); // 這行能被正常執(zhí)行 $myclass2->Foo2(); // 公有的和受保護(hù)的都可執(zhí)行,但私有的不行 class Bar { public function test() { $this->testPrivate(); $this->testPublic(); } public function testPublic() { echo "Bar::testPublic\n"; } private function testPrivate() { echo "Bar::testPrivate\n"; } } class Foo extends Bar { public function testPublic() { echo "Foo::testPublic\n"; } private function testPrivate() { echo "Foo::testPrivate\n"; } } $myFoo = new foo(); $myFoo->test(); // Bar::testPrivate // Foo::testPublic ?>??????? ???(??)? ??? ???? ???? ??? ???? ?? ?? ??? ??? ??? ??? ??? ?????? ???? ????. ???. ? ??? ??? ??? ???? ????? ???? ????? ??? ??? ?????? ?? ?? ? ?? ??? ???? ?? ?????. ?? ???? ???? ??? ???? ??????.
<?php class Person { //將成員屬性定義為 private private $name; private $age; //定義一個(gè)構(gòu)造方法初始化賦值 function __construct($name, $age) { $this->name=$name; $this->age=$age; } function say() { echo "我的名字叫:".$this->name." <br >"; echo "我的年齡是:".$this->age; } } $p1=new Person("張三", 20); $p1->say(); ?>
Interface
PHP ???? ?? ?????. ?, ???? ????. ?? ?? ???? ?? ???? ??? ??? ?? ??? ?????. ??? ??? PHP? ??? ????? ??? ?????.
?? ???? ?? ???? ?? ????? ??? ???? ?? ?????? ?? ??? ?? ??? ?? ?? ? ?? ?? ???? ??????? ???.
?????? ???? ???? ???? ?? ???? ??? ? ??? ??? ???? ?? ??? ??? ??? ????.
?????? ?? ??? ??? ????? ????? ???? ?? ?????, ? ?? ??? ???? ?? ?? ????. ?????? ??? ?? ???? ????? ???. ?? ?????? ?????.
<?php //定義接口 interface User{ function getDiscount(); function getUserType(); } //VIP用戶 接口實(shí)現(xiàn) class VipUser implements User{ // VIP 用戶折扣系數(shù) private $discount = 0.8; function getDiscount() { return $this->discount; } function getUserType() { return "VIP用戶"; } } class Goods{ var $price = 100; var $vc; //定義 User 接口類型參數(shù),這時(shí)并不知道是什么用戶 function run(User $vc){ $this->vc = $vc; $discount = $this->vc->getDiscount(); $usertype = $this->vc->getUserType(); echo $usertype."商品價(jià)格:".$this->price*$discount; } } $display = new Goods(); $display ->run(new VipUser);//可以是更多其他用戶類型 ?>??:VIP ??? ?? ??: 80??
PHP? ???? ??? ? ??? ?? ?????? ??? ?? ????.
??? ?? ???? ?? ??? ??? ?????. ????? 1, ????? 2, ...
{
......
}
?? ???? ?????? ???
?????? ??? ?? ????? ??? ????? ??? ? ????. ?????? ?? ???? ???? ???? ??? ????.
?? ???? ?????? ???? ??(?? ??? ????) ?????? ?? ???? ???? ???. ??? ???? ???? ???.
?????? ??? ??? ??? ???? ? ?????? ???? ?? ?? ???? ??? ??? ????? ?????? ??, ?? ???? ??? ??? ???? ?? ?? ???? ??? ??? ???????. ??? ?? ????. ?? ??? ???(?? ???? ?? ???)? ??? ????.
?? ???? ????? ??? ? ????. ?? ???? ?? ?? ????? ????? ?? ??? ???? ?? ?? ?????? ???? ???.
??
???? ??() ?? ?? const ???? ???? ????? ??? ?????.
??? ??? ??? ?? ?? ??? ??? ? ????. ??? ???? ??? ? $ ??? ??? ??? ????.
??? ?? ??? ???? ?? ??, ??? ??, ?? ??? ?? ?? ?? ??? ? ? ????.
PHP 5.3.0?? ??? ???? ???? ???? ??? ? ????. ??? ? ??? ?? ???(?: self, parent ?? static)? ? ????.
??
const ?? = "value";
????:
<?php Class Person{ // 定義常量 const country = "中國"; public function myCountry() { //內(nèi)部訪問常量 echo "我是".self::country."人 <br >"; } } // 輸出常量 echo Person::country." <br >"; // 訪問方法 $p1 = new Person(); $p1 -> myCountry(); ?>
?? ??:
??
?? ???
?? ???
?? ???? ??? ??? ? ?? ??? ???? ??? ?? ?? ???? ???? ????? ???.
???? ??? ???? ?????? ? ????.
???? ??? ???? ?? ???(????)? ???? ?? ?? ??? ??? ?? ????.
?? ???? ??? ? ?? ???? ?? ???? ?? ?? ???? ???? ??, ??? ???? ??? ??? ?? ???? ????? ? ????? ???. ?? ?? ?? ???? protected? ??? ?? ?? ???? ??? ???? protected ?? public?? ????? ?? private?? ??? ? ????. ?? ???? ???? ???? ???? ???. ?, ?? ????? ??? ??? ????? ???. ?? ??, ?? ???? ?? ???? ?? ??? ??? ???? ?? ??? ?? ??? ???? ?? ? ?? ?? ??? ????.
<?php abstract class AbstractClass { // 強(qiáng)制要求子類定義這些方法 abstract protected function getValue(); abstract protected function prefixValue($prefix); // 普通方法(非抽象方法) public function printOut() { print $this->getValue() . PHP_EOL; } } class ConcreteClass1 extends AbstractClass { protected function getValue() { return "ConcreteClass1"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClass1"; } } class ConcreteClass2 extends AbstractClass { public function getValue() { return "ConcreteClass2"; } public function prefixValue($prefix) { return "{$prefix}ConcreteClass2"; } } $class1 = new ConcreteClass1; $class1->printOut(); echo $class1->prefixValue('FOO_') . PHP_EOL; $class2 = new ConcreteClass2; $class2->printOut(); echo $class2->prefixValue('FOO_') . PHP_EOL; ?>
? ? ??? ???? ?? ??? ??? ????.
ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2
?? ???
? ??? ???? ???? ???? ???? ??????? ??? ?? ???? ? ????.
?? ??? ?????? ???? ??? ?? ???? ? ????(??? ?? ???? ???).
?? ?????? ?? ??? ???? ???? ?? ?????? ?? ?? $this? ??? ? ????.
??? -> ???? ?? ?? ??? ???? ? ????.
PHP 5.3.0?? ??? ???? ???? ???? ??? ? ????. ??? ? ??? ?? ??? self, parent ?? static? ? ????.
<?php Class Person{ // 定義靜態(tài)成員屬性 public static $country = "中國"; // 定義靜態(tài)成員方法 public static function myCountry() { // 內(nèi)部訪問靜態(tài)成員屬性 echo "我是".self::$country."人<br >"; } } class Student extends Person { function study() { echo "我是". parent::$country."人<br >"; } } // 輸出成員屬性值 echo Person::$country."<br >";// 輸出:中國 $p1 = new Person(); //echo $p1->country;// 錯(cuò)誤寫法 // 訪問靜態(tài)成員方法 Person::myCountry();// 輸出:我是中國人 // 靜態(tài)方法也可通過對象訪問: $p1->myCountry(); // 子類中輸出成員屬性值 echo Student::$country."<br >";// 輸出:中國 $t1 = new Student(); $t1->study();// 輸出:我是中國人 ?>
?? ??:
China
I am Chinese
I am Chinese
China
I am Chinese
?? ???
PHP 5?? ??? ?? ???? ???????. ?? ???? ???? final? ???? ?? ???? ?? ???? ???? ? ????. ???? final? ???? ??? ? ????.
?? ??? Person
{
...... <?php
class BaseClass {
public function test() {
echo "BaseClass::test() called" . PHP_EOL;
}
final public function moreTesting() {
echo "BaseClass::moreTesting() called" . PHP_EOL;
}
}
class ChildClass extends BaseClass {
public function moreTesting() {
echo "ChildClass::moreTesting() called" . PHP_EOL;
}
}
// 報(bào)錯(cuò)信息 Fatal error: Cannot override final method BaseClass::moreTesting()
?>
?? ??? ??? ??
<?php class BaseClass { function __construct() { print "BaseClass 類中構(gòu)造方法" . PHP_EOL; } } class SubClass extends BaseClass { function __construct() { parent::__construct(); // 子類構(gòu)造方法不能自動調(diào)用父類的構(gòu)造方法 print "SubClass 類中構(gòu)造方法" . PHP_EOL; } } class OtherSubClass extends BaseClass { // 繼承 BaseClass 的構(gòu)造方法 } // 調(diào)用 BaseClass 構(gòu)造方法 $obj = new BaseClass(); // 調(diào)用 BaseClass、SubClass 構(gòu)造方法 $obj = new SubClass(); // 調(diào)用 BaseClass 構(gòu)造方法 $obj = new OtherSubClass(); ?>? ????? ???? ?? ??? ??? ????.
BaseClass ???? ?? ??? BaseClass ???? ?? ???
SubClass ???? ?? ???
BaseClass ???? ?? ??? BaseClass ???