1.類的繼承
在PHP和Java語言里面沒有多繼承字旭,只有單繼承
// 定義一個“人”類做為父類
class Person
{
// 下面是人的成員屬性
var $name; //人的名子
var $sex; //人的性別
var $age; //人的年齡
// 定義一個構(gòu)造方法參數(shù)為屬性姓名$name、性別$sex和年齡$age進(jìn)行賦值
function __construct($name, $sex, $age)
{
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
// 這個人可以說話的方法, 說出自己的屬性
function say()
{
echo "我的名子叫:" . $this->name . " 性別:" . $this->sex . " 我的年齡是:" . $this->age;
}
}
class Student extends Person
{
var $school; // 學(xué)生所在學(xué)校的屬性
// 這個學(xué)生學(xué)習(xí)的方法
function study()
{
echo "我的名字叫:" . $this->name . " 我正在" . $this->school . "學(xué)習(xí)<br />";
}
}
2.重載新的方法(parent::)
一種是使用父類的“類名::“來調(diào)用父類中被覆蓋的方法入挣;
class Student extends Person
{
var $school; // 學(xué)生所在學(xué)校的屬性
function __construct($name, $sex, $age, $school)
{
// 使用父類中的方法為原有的屬性賦值
parent::__construct($name, $sex, $age);
$this->school = $school;
}
// 這個學(xué)生學(xué)習(xí)的方法
function study()
{
echo "我的名子叫:" . $this->name . " 我正在" . $this->school . " 學(xué)習(xí)";
}
// 這個人可以說話的方法, 說出自己的屬性
function say()
{
parent::say();
// 加上一點(diǎn)自己的功能
echo "我的年齡是:" . $this->age . " 我在" . $this->school . "上學(xué)";
}
}
3.訪問類型(public专执,protected,private)
PHP5支持如下3種訪問修飾符:
public (公有的吭服、默認(rèn)的)擅羞,protected (受保護(hù)的)和private (私有的)三種尸变。
子類中方法的訪問權(quán)限一定不能低于父類被覆蓋方法的訪問權(quán)限,也就是一定要高于或等于父類方法的訪問權(quán)限减俏。
4.final關(guān)鍵字的應(yīng)用
使用final關(guān)鍵標(biāo)記的類不能被繼承召烂;
<?php
final class Person
{
function say(){}
}
class Student extends Person
{
function say() {}
}
?>
使用final關(guān)鍵標(biāo)記的方法不能被子類覆蓋,是最終版本垄懂;
<?php
class Person
{
final function say() {}
}
class Student extends Person
{
function say() {}
}
?>
5.static和const關(guān)鍵字的使用(self::)
類的靜態(tài)變量骑晶,非常類似全局變量痛垛,能夠被所有類的實(shí)例共享,類的靜態(tài)方法也是一樣的桶蛔,類似于全局函數(shù)匙头。
<?
class Person
{
// 下面是人的靜態(tài)成員屬性
public static $myCountry = "中國";
// var $name; //人的名子
// 這是人的靜態(tài)成員方法
public static function say()
{
echo "我是中國人";
}
}
// 輸出靜態(tài)屬性
echo Person::$myCountry;
// 訪問靜態(tài)方法
Person::say();
// 重新給靜態(tài)屬性賦值
Person::$myCountry = "美國";
echo Person::$myCountry;
?>
使用對象訪問不到靜態(tài)成員的,
類里面的靜態(tài)方法只能訪問類的靜態(tài)的屬性仔雷,
靜態(tài)的方法是不用對象調(diào)用的蹂析,而是使用類名來訪問
self和$this相似,只不過self是代表這個靜態(tài)方法所在的類
<?
class Person
{
// 下面是人的靜態(tài)成員屬性
public static $myCountry = "中國";
// 這是人的靜態(tài)成員方法碟婆, 通過self訪問其它靜態(tài)成員
public static function say()
{
echo "我是" . self::$myCountry;
}
}
// 訪問靜態(tài)方法
Person::say();
?>
!!!用“const”修飾的成員屬性的訪問方式和“static”修飾的成員訪問的方式差不多电抚,也是使用“類名”,在方法里面使用“self”關(guān)鍵字竖共。但是不用使用“$”符號蝙叛,也不能使用對象來訪問。
<?php
class MyClass
{
// 定義一個常量constant
const constant = 'constant value';
function showConstant()
{
echo self::constant . " "; // 使用self訪問公给,不要加“$”
}
}
echo MyClass::constant . " "; // 使用類名來訪問借帘,也不加“$”
$class = new MyClass();
$class->showConstant();
// echo $class::constant; // 是不允許的
?>
6.__toString()方法
<?php
// Declare a simple class
class TestClass
{
public $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
// 定義一個__toString方法,返加一個成員屬性$foo
public function __toString()
{
return $this->foo;
}
}
$class = new TestClass('Hello');
// 直接輸出對象
echo $class;
?>
7.克隆對象__clone()方法
在PHP4中我們使用“clone”這個關(guān)鍵字克隆對象淌铐;
<?
class Person
{
// 下面是人的成員屬性
var $name; // 人的名子
var $sex; // 人的性別
var $age; // 人的年齡
// 定義一個構(gòu)造方法參數(shù)為屬性姓名$name肺然、性別$sex和年齡$age進(jìn)行賦值
function __construct($name = "", $sex = "", $age = "")
{
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
// 這個人可以說話的方法,說出自己的屬性
function say()
{
echo "我的名子叫:" . $this->name . " 性別:" . $this->sex . " 我的年齡是:" . $this->age . "<br>";
}
}
$p1 = new Person("張三", "男", 20);
// 使用“clone”克隆新對象p2腿准,和p1對象具有相同的屬性和方法际起。
$p2=clone $p1;
$p2->say();
?>
如果想在克隆后改變原對象的內(nèi)容,需要在__clone()中重寫原本的屬性和方法吐葱, “__clone()”方法可以沒有參數(shù)街望,它自 動包含$this和$that兩個指針,$this指向復(fù)本唇撬,而$that指向原本它匕;
<?
class Person
{
// 下面是人的成員屬性
var $name; // 人的名子
var $sex; // 人的性別
var $age; // 人的年齡
// 定義一個構(gòu)造方法參數(shù)為屬性姓名$name、性別$sex和年齡$age進(jìn)行賦值
function __construct($name = "", $sex = "", $age = "")
{
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
// 這個人可以說話的方法, 說出自己的屬性
function say()
{
echo "我的名子叫:" . $this->name . " 性別:" . $this->sex . " 我的年齡是:" . $this->age . "<br>";
}
// 對象克隆時自動調(diào)用的方法, 如果想在克隆后改變原對象的內(nèi)容窖认,需要在__clone()中重寫原本的屬性和方法
function __clone()
{
// $this指的復(fù)本p2, 而$that是指向原本p1,這樣就在本方法里告希,改變了復(fù)本的屬性扑浸。
$this->name = "我是假的 $that->name";
$this->age = 30;
}
}
$p1 = new Person("張三", "男", 20);
$p2 = clone $p1;
$p1->say();
$p2->say();
?>
我的名子叫:張三 性別:男 我的年齡是:20我的名子叫:我是假的張三 性別:男 我的年齡是:30
8.__call()處理調(diào)用錯誤
可不可以在程序調(diào)用對象內(nèi)部 不存在的方法時,提示我們調(diào)用的方法及使用的參數(shù)不存在燕偶,但程序還可以繼續(xù)執(zhí)行喝噪,這個時候我們就要使用在調(diào)用不存在的方法時自動調(diào)用的方 法“__call()”
<?php
//這是一個測試的類,里面沒有屬性和方法
class Test
{
}
//產(chǎn)生一個Test類的對象
$test = new Test();
//調(diào)用對象里不存在的方法
$test->demo("one", "two", "three");
//程序不會執(zhí)行到這里
echo "this is a test<br>";
?>
//Fatal error: Call to undefined method Test::demo()
<?php
//這是一個測試的類指么,里面沒有屬性和方法
class Test
{
// 調(diào)用不存的方法時自動調(diào)用的方法酝惧,第一個參數(shù)為方法名榴鼎,第二個參數(shù)是數(shù)組參數(shù)
function __call($function_name, $args)
{
print "你所調(diào)用的函數(shù):$function_name(參數(shù):";
print_r($args);
echo ")不存在!<br>";
}
}
// 產(chǎn)生一個Test類的對象
$test=new Test();
// 調(diào)用對象里不存在的方法
$test->demo("one", "two", "three");
// 程序不會退出可以執(zhí)行到這里
echo "this is a test<br>";
?>
9.抽象方法和抽象類(abstract)
子類必須把父類中的抽象方法全部都實(shí)現(xiàn)晚唇,否則子類中還存在抽象方法巫财,那么子類還是抽象類,還是不能實(shí)例化類
<?
abstract class Demo
{
var $test;
abstract function fun1();
abstract function fun2();
function fun3()
{
...
}
}
$demo = new Demo(); // 抽象類不能產(chǎn)生實(shí)例對象哩陕,所以這樣做是錯的平项,實(shí)例化對象交給子類
class Test extends Demo
{
function fun1()
{
...
}
function fun2()
{
...
}
}
$test = new Test(); // 子類可以實(shí)例化對象,因?yàn)閷?shí)現(xiàn)了父類中所有抽象方法
?>
10.PHP5接口技術(shù)(interface)
<?php
// 使用”extends”繼承另外一個接口
interface Two extends One
{
function fun3();
function fun4();
}
?>
<?php
// 使用“implements”這個關(guān)鍵字去實(shí)現(xiàn)接口中的抽象方法 接口和類之間
class Three implements One
{
function fun1()
{
...
}
function fun2()
{
...
}
}
// 實(shí)現(xiàn)了全部方法悍及,我們?nèi)タ梢允褂米宇惾?shí)例化對象了
$three = new Three();
?>
<?php
// 使用extends繼承一個類闽瓢,使用implements實(shí)現(xiàn)多個接口
class Four extends 類名一 implemtns 接口一, 接口二, ...
{
// 所有接口中的方法都要實(shí)現(xiàn)才可以實(shí)例化對象
...
}
?>
11.多態(tài)的應(yīng)用
<?php
// 定義了一個形狀的接口,里面有兩個抽象方法讓子類去實(shí)現(xiàn)
interface Shape
{
function area();
function perimeter();
}
// 定義了一個矩形子類實(shí)現(xiàn)了形狀接口中的周長和面積
class Rect implements Shape
{
private $width;
private $height;
function __construct($width, $height)
{
$this->width = $width;
$this->height = $height;
}
function area()
{
return "矩形的面積是:" . ($this->width * $this->height);
}
function perimeter()
{
return "矩形的周長是:" . (2 * ($this->width + $this->height));
}
}
// 定義了一個圓形子類實(shí)現(xiàn)了形狀接口中的周長和面積
class Circular implements Shape
{
private $radius;
function __construct($radius)
{
$this->radius=$radius;
}
function area()
{
return "圓形的面積是:" . (3.14 * $this->radius * $this->radius);
}
function perimeter()
{
return "圓形的周長是:" . (2 * 3.14 * $this->radius);
}
}
// 把子類矩形對象賦給形狀的一個引用
$shape = new Rect(5, 10);
echo $shape->area() . "<br>";
echo $shape->perimeter() . "<br>";
// 把子類圓形對象賦給形狀的一個引用
$shape = new Circular(10);
echo $shape->area() . "<br>";
echo $shape->perimeter() . "<br>";
?>
12.把對象串行化serialize()方法心赶,__sleep()方法扣讼,__wakeup()方法
有時候需要把一個對象在網(wǎng)絡(luò)上傳輸,為了方便傳輸缨叫,可以把整個對象轉(zhuǎn)化為二進(jìn)制串届谈,等到達(dá)另一端時,再還原為原來的對象弯汰,這個過程稱之為串行化(也叫序列化)
<?
class Person
{
// 下面是人的成員屬性
var $name; // 人的名子
var $sex; // 人的性別
var $age; // 人的年齡
// 定義一個構(gòu)造方法參數(shù)為屬性姓名$name艰山、性別$sex和年齡$age進(jìn)行賦值
function __construct($name = "", $sex = "", $age = "")
{
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
// 這個人可以說話的方法, 說出自己的屬性
function say()
{
echo "我的名子叫:" . $this->name . " 性別:" . $this->sex . " 我的年齡是:" . $this->age . "<br>";
}
}
$p1 = new Person("張三", "男", 20);
$p1_string = serialize($p1); // 把一個對象串行化,返一個字符串
echo $p1_string . "<br>"; // 串行化的字符串我們通常不去解析
$p2 = unserialize($p1_string); // 把一個串行化的字符串反串行化形成對象$p2
$p2->say();
?>
在PHP5中有兩個魔術(shù)方法__sleep()方法和__wakeup()方法咏闪,在對象串行化的時候曙搬,會調(diào)用一個__sleep()方法來完成一 些睡前的事情;而在重新醒來鸽嫂,即由二進(jìn)制串重新組成一個對象的時候纵装,則會自動調(diào)用PHP的另一個函數(shù)__wakeup(),做一些對象醒來就要做的動作据某。
<?
class Person
{
// 下面是人的成員屬性
var $name; // 人的名子
var $sex; // 人的性別
var $age; // 人的年齡
// 定義一個構(gòu)造方法參數(shù)為屬性姓名$name橡娄、性別$sex和年齡$age進(jìn)行賦值
function __construct($name = "", $sex = "", $age = "")
{
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
// 這個人可以說話的方法, 說出自己的屬性
function say()
{
echo "我的名子叫:" . $this->name . " 性別:" . $this->sex . " 我的年齡是:" . $this->age . "<br>";
}
// 指定串行化時把返回的數(shù)組中$name和$age值串行化,忽略沒在數(shù)組中的屬性$sex
function __sleep()
{
$arr = array("name", "age"); // 此時癣籽,屬性$sex將被刪除M彀Α!筷狼!
return($arr);
}
// 重新生成對象時瓶籽,并重新賦值$age為40
function __wakeup()
{
$this->age = 40;
}
}
$p1 = new Person("張三", "男", 20);
// 把一個對象串行化,返一個字符串埂材,調(diào)用了__sleep()方法,忽略沒在數(shù)組中的屬性$sex
$p1_string = serialize($p1);
echo $p1_string . "<br>"; // 串行化的字符串我們通常不去解析
$p2 = unserialize($p1_string); // 反串行化形成對象$p2重新賦值$age為40
$p2->say();
?>
//output
O:6:"Person":2:{s:4:"name";s:4:"張三";s:3:"age";i:20;}
我的名子叫:張三 性別: 我的年齡是:40
13.自動加載類 __autoload()函數(shù)
在 PHP 5 中塑顺,可以定義一個 __autoload()函數(shù),它會在試圖使用尚未被定義的類時自動調(diào) 用俏险,通過調(diào)用此函數(shù)严拒,腳本引擎在 PHP 出錯失敗前有了最后一個機(jī)會加載所需的類扬绪, __autoload()函數(shù)接收的一個參數(shù),就是你想加載的類的 類名
<?php
function __autoload($classname)
{
require_once $classname . '.php';
}
//MyClass1類不存在時裤唠,自動調(diào)用__autoload()函數(shù)挤牛,傳入?yún)?shù)”MyClass1”
$obj = new MyClass1();
//MyClass2類不存在時,自動調(diào)用__autoload()函數(shù)巧骚,傳入?yún)?shù)”MyClass2”
$obj2 = new MyClass2();
?>
注意:__autoload() 是專門為 類的不存在 而設(shè)計的I薜摺!劈彪!很多框架利用這個函數(shù)竣蹦,實(shí)現(xiàn) 類文件的自動加載 2病q小蕾久!