類温艇,成員方法,類的實(shí)例化,成員變量蜡饵,類常量
class SportObject{ //定義類
function beatBasketball($name,$height,$age){ //聲明成員方法
echo "姓名:".$name;
echo "身高:".$height;
echo "年齡:".$age;
if($height>180 and $age>15){
return $name."符合";
}else{
return $name."不符合";
}
}
// 定義變量的關(guān)鍵字:public private protected static final
public $name; //定義成員變量
public $height;
public $age;
public function bootFootBall($name,$height,$age){ //聲明成員方法
$this->name=$name;
$this->height=$height;
$this->age=$age;
if($this->height<185 and $this->age>20){
return $this->name."符合<br>"; //方法實(shí)現(xiàn)的功能
}else{
return $this->name."不符合<br>";
}
}
const BOOK_TYPE='計(jì)算機(jī)圖書'; //聲明常量
public $object_name; //聲明變量
function setObjectName($name){ //聲明方法
$this->object_name=$name; //設(shè)置成員變量值
}
function getObjectName(){ //聲明方法
return $this->object_name;
}
}
$sport=new SportObject(); //類的實(shí)例化
echo $sport->beatBasketball('空空','40','20'); //調(diào)用方法
echo $sport->bootFootball('空空','180','30'); //執(zhí)行類中的方法
//輸出計(jì)算機(jī)圖書->php類
//定義常量的關(guān)鍵字:const
$c_book=new SportObject(); //實(shí)例化
$c_book->setObjectName('php類'); //調(diào)用方法
echo SportObject::BOOK_TYPE."->"; //輸出常量
echo $c_book->getObjectName();
1.類要在一個(gè)
<?php...?>
中条辟,不可被分割
2.成員方法即類中函數(shù)黔夭,實(shí)現(xiàn)類的行為
3.類的實(shí)例化:對(duì)象名=new 類名
4.調(diào)用方法:對(duì)象名->成員方法
5.$this->xxx
作用是調(diào)用本類中的成員變量或成員方法
6.類中的變量:成員變量
7.無論是使用$this->xxx
還是對(duì)象名->xxx
的格式,后面的變量都是沒有$
符號(hào)的
8.輸出常量不需要實(shí)例化對(duì)象羽嫡,直接由類名::常量名
調(diào)用即可(域操作符
構(gòu)造方法和析構(gòu)方法
class SportObject2{
public $name;
public $height;
public $age;
public function __construct($name,$height,$age){ //定義構(gòu)造方法
$this->name=$name;
$this->height=$height;
$this->age=$age;
}
public function bootFoot(){
if($this->height<185 and $this->age>20){
return $this->name."都符合<br>"; //方法實(shí)現(xiàn)的功能
}else{
return $this->name."都不符合<br>";
}
}
function showMe(){
echo "這句話不會(huì)顯示"; //用于驗(yàn)證下面多態(tài)的覆蓋
}
function __destruct(){
echo "<p>對(duì)象被銷毀本姥,調(diào)用析構(gòu)函數(shù)</p>";
}
//當(dāng)對(duì)象結(jié)束其生命周期,如對(duì)象所在的函數(shù)已調(diào)用完畢時(shí)杭棵,系統(tǒng)自動(dòng)執(zhí)行析構(gòu)函數(shù)婚惫。
}
$sport=new SportObject2('xixi','185','29'); //實(shí)例化類并傳遞參數(shù)
// 與上面不同的是:實(shí)例化時(shí)只需一條語句即可賦值執(zhí)行
echo $sport->bootFoot(); //執(zhí)行類中的方法
1.構(gòu)造方法是生成對(duì)象時(shí)自動(dòng)執(zhí)行的方法,作用是初始化對(duì)象
2.析構(gòu)函數(shù)往往用來做“清理善后” 的工作(例如在建立對(duì)象時(shí)用new開辟了一片內(nèi)存空間魂爪,delete會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)后釋放內(nèi)存)
3.如果類中有構(gòu)造方法先舷,則在實(shí)例化時(shí)只需一條語句即可對(duì)成員變量進(jìn)行賦值$sport=new SportObject2('xixi','185','29');
繼承,多態(tài)
//子類 beatBall
class BeatBall extends SportObject2{ //定義子類甫窟,繼承父類
public $height;
function __construct($name,$height){ //定義構(gòu)造方法
$this->height=$height;
$this->name=$name;
}
function showMe(){ //再次定義方法showMe()->驗(yàn)證多態(tài)的覆蓋
if($this->height>170){
return $this->name."體重符合<br>";
}else{
return $this->name."體重不符合<br>";
}
}
}
//子類 WeightLift
class WeightLift extends SportObject2{
function showMe(){ //再次定義方法showMe()->驗(yàn)證多態(tài)的覆蓋
if($this->age>15){
return $this->name."年齡符合<br>";
}else{
return $this->name."年齡不符合<br>";
}
}
}
$beatball=new BeatBall('heihei','190');
$weightlift=new WeightLift('xixi','190','25');
echo $beatball->showMe()."<br>";
//輸出:heihei體重符合 調(diào)用的是第二個(gè)showMe()方法
echo $weightlift->showMe()."<br>";
//輸出:xixi年齡符合 調(diào)用的是第三個(gè)showMe()方法
class C{
function __call($name,$num){ //調(diào)用不存在的方法時(shí)會(huì)執(zhí)行的方法
// $name 為調(diào)用的不存在的函數(shù)名
// $num 為調(diào)用不存在函數(shù)時(shí)傳遞的參數(shù)密浑,類型為數(shù)組
// count($array) 返回?cái)?shù)組的總個(gè)數(shù)
echo "方法名:".$name; //輸出方法名
echo "參數(shù)存在個(gè)數(shù):".count($num); //輸出參數(shù)個(gè)數(shù)
if(count($num)==1){ //根據(jù)參數(shù)不同調(diào)用不同的方法
echo $this->list1($num[0]);
}
if(count($num)==2){
echo $this->list2($num[0],$num[1]);
}
}
public function list1($a){
return "list1:$a";
}
public function list2($a,$b){
return "list2:a->$a,b->$b";
}
}
$a=new C;
echo $a->firstshow('kongkong','18'); //兩個(gè)參數(shù)
//輸出:方法名:firstshow 參數(shù)存在個(gè)數(shù):2
echo $a->secondshow('kongkong'); //一個(gè)參數(shù)
//輸出:方法名:secondshow 參數(shù)存在個(gè)數(shù):1
1.繼承通過關(guān)鍵字
extends
來聲明 格式class subClass extends superClass{...}
2.如果繼承的父類中無構(gòu)造函數(shù),而子類調(diào)用方法時(shí)直接實(shí)例化傳遞參數(shù)是傳遞不了的
3.多態(tài)兩種形式:覆蓋和重載
4.覆蓋:在子類中重寫父類方法粗井,調(diào)用時(shí)會(huì)先調(diào)用子類的(如上文中關(guān)于showMe()
的調(diào)用
5.重載:一個(gè)標(biāo)識(shí)符被用作多個(gè)函數(shù)名尔破,且能通過函數(shù)的參數(shù)個(gè)數(shù)或參數(shù)類型將這些同名的函數(shù)區(qū)分開來街图,做到調(diào)用時(shí)不發(fā)生混淆
數(shù)據(jù)隱藏
限定類成員(包括變量和方法)訪問權(quán)限的關(guān)鍵字:
public
private
,protected
,static
,final
private
class book{
private $name='computer'; //聲明私有變量
public function setname($name){ //設(shè)置私有變量方法
$this->name=$name;
}
public function getname(){ //讀取私有變量
return $this->name;
}
}
class lbook extends book{
}
$lbook=new lbook();
//只能用調(diào)用成員方法的方式來訪問私有變量
echo 'true pratice:';
$lbook->setname('jiuzhe');
echo $lbook->getname();
//輸出:true pratice:jiuzhe
echo '<br>false result:';
echo book::$name; //錯(cuò)誤操作,會(huì)報(bào)錯(cuò)
private
修飾的變量和方法只能在所屬類內(nèi)部被調(diào)用懒构,不可以在類外部被訪問餐济,子類也不行
protected
//被protected修飾可以在本類和子類中被調(diào)用
class book2{
protected $name='computer';
}
class lbook2 extends book2{
public function showme(){
echo '$name:'.$this->name;
}
}
$lbook2=new lbook2();
$lbook2->showme();
//輸出:$name:computer
被
protected
修飾可以在本類和子類中被調(diào)用,其他地方不行
static
class book3{
static $num=0; //聲明靜態(tài)變量$num
public function showme(){
echo '第'.self::$num.'位訪客';
self::$num++; //調(diào)用靜態(tài)變量的方式
}
}
$book1=new book3();
$book1->showme();
//輸出:第0位訪客
$book2=new book3();
$book2->showme();
//輸出:第1位訪客
echo '第'.book3::$num.'位訪客'; //直接使用類名調(diào)用靜態(tài)變量
//輸出:第2位訪客
1.關(guān)鍵字
static
胆剧,使用靜態(tài)變量可以不需要實(shí)例化而直接調(diào)用絮姆,如關(guān)鍵字::靜態(tài)成員
2.靜態(tài)方法只能調(diào)用靜態(tài)變量,普通方法可以調(diào)用靜態(tài)變量
final
final class finaltest{ //final類
function __construct(){
echo 'initialize object';
}
}
class heihei extends finaltest{ //創(chuàng)建子類
static function exam(){
echo '1';
}
}
heihei::exam();
//調(diào)用子類方法 - 報(bào)錯(cuò)Class heihei may not inherit from final class
關(guān)鍵字
final
秩霍,final方法不可以被繼承篙悯、不能再有子類
抽象類
abstract class commodity{ //定義抽象類,關(guān)鍵字abstract
abstract function service($getname,$price,$num); //定義抽象方法
}
class mybook extends commodity{ //定義抽象類的子類
function service($getname,$price,$num){ //實(shí)現(xiàn)抽象類中的方法
echo '商品:'.$getname.',價(jià)格是:'.$price.'數(shù)量為:'.$num;
}
}
class mycomputer extends commodity{ //定義抽象類的子類
function service($getname,$price,$num){ //實(shí)現(xiàn)抽象類中的方法
echo '商品:'.$getname.',價(jià)格是:'.$price.'數(shù)量為:'.$num;
}
}
$book=new mybook();
$computer=new mycomputer();
$book->service('php','123','10');
//輸出: 商品:php,價(jià)格是:123數(shù)量為:10
1.抽象類不能被實(shí)例化铃绒,只能作為其他類的父類使用 使用
abstract
來聲明
2.抽象類至少要包含一個(gè)抽象方法
3.子類必須實(shí)現(xiàn)抽象父類的方法鸽照,除此之外可以實(shí)現(xiàn)其他的方法
接口
//聲明接口MPopedom
interface MPopedom{
function popedom();
}
//聲明接口MPuview
interface MPuview{
function purview();
}
//創(chuàng)建子類Member 實(shí)現(xiàn)一個(gè)接口MPuview
class Member implements MPuview{
function purview(){
echo '會(huì)員擁有的權(quán)限';
}
}
//創(chuàng)建子類Manager 實(shí)現(xiàn)多個(gè)接口MPuview和MPopedom
class Manager implements MPuview,MPopedom{
function purview(){
echo '管理員擁有會(huì)員擁有的權(quán)限';
}
function popedom(){
echo '管理員還有會(huì)員沒的';
}
function heihei(){ //除了接口的方法還可以實(shí)現(xiàn)新的方法
echo 'haha !';
}
}
$member=new Member();
$manager=new Manager();
$member->purview();
//輸出:會(huì)員擁有的權(quán)限
$manager->purview();
//輸出:管理員擁有會(huì)員擁有的權(quán)限
$manager->popedom();
//輸出:管理員還有會(huì)員沒的
$manager->heihei();
//輸出:haha !
1.接口使用
interface來聲明,子類通過
implements`來實(shí)現(xiàn)接口
2.要實(shí)現(xiàn)多個(gè)接口就應(yīng)在每個(gè)接口間用逗號(hào)分割颠悬,且接口中的方法需要在子類中全部實(shí)現(xiàn)
3.除了接口方法矮燎,可以使用新方法
克隆
class bookbook{
private $obtype='book';
public function settype($obtype){
$this->obtype=$obtype;
}
public function gettype(){
return $this->obtype;
}
}
$book1=new bookbook();
$book2=$book1; //使用普通數(shù)據(jù)類型的方法賦值
$book2->settype('computer'); //改變$boo2的值
echo $book1->gettype().'<br>'; //輸出對(duì)象$book1的值
//輸出:computer
echo $book2->gettype(); //輸出對(duì)象$book2的值
//輸出:computer
可見連
$book1
的值也被改變
class cloneobject{
private $obtype='book';
public function settype($type){
$this->obtype=$type;
}
public function gettype(){
return $this->obtype;
}
public function __clone(){ //聲明clone方法
$this->obtype='game';
}
}
$book1=new cloneobject();
$book2=clone $book1; //使用克隆對(duì)象的方法給對(duì)象book2賦值
echo 'book1:'.$book1->gettype();
//輸出:book1:book
echo 'book2:'.$book2->gettype();
//輸出:book2:game
使用克隆對(duì)象,
$boo1
的值未被改變
對(duì)象比較
class compareobject{
private $name;
function __construct($name){
$this->name=$name;
}
}
$book=new compareobject('book');
$clonebook=clone $book; //克隆對(duì)象
$rebook=$book; //引用對(duì)象
if($clonebook==$book){
echo '兩個(gè)對(duì)象的內(nèi)容相等<br>';
}
if($rebook===$book){
echo '兩個(gè)對(duì)象的引用地址相等';
}
輸出:
兩個(gè)對(duì)象的內(nèi)容相等
兩個(gè)對(duì)象的引用地址相等
==
比較兩個(gè)對(duì)象的內(nèi)容===
比較對(duì)象的引用地址
對(duì)象類型檢測(cè)
class objecttype{} //父類
class myitem extends objecttype{ //子類
private $type;
}
$citem=new myitem();
if($citem instanceof myitem)
echo '對(duì)象citem屬于myitem類<br>';
if($citem instanceof objecttype)
echo '對(duì)象citem屬于objecttype類';
輸出:
對(duì)象citem屬于myitem類
對(duì)象citem屬于objecttype類
instanceof
檢測(cè)當(dāng)前對(duì)象屬于哪個(gè)類
魔術(shù)方法 __set() __get()
class magicobject{
private $type='';
public function __get($name){
if(isset($this->$name)){ //判斷變量是否被聲明
echo '已聲明赔癌,變量值為:'.$this->$name.'<br>';
}else{
echo '未聲明诞外,初始化為0'.'<br>';
$this->$name=0; //未聲明則對(duì)變量初始化
}
}
public function __set($name,$value){
if(isset($this->$name)){
$this->$name=$value;
echo '存在的變量,賦值為:'.$value.'<br>';
}else{
$this->$name=$value;
echo '不存在的變量灾票,初始化為'.$value.'<br>';
}
}
}
$mycomputer=new magicobject();
$mycomputer->type='diy'; //給變量賦值
$mycomputer->type; //調(diào)用變量$type
//輸出:存在的變量峡谊,賦值為:diy<br>已聲明,變量值為:diy
$mycomputer->name; //調(diào)用變量$name
//輸出:未聲明刊苍,初始化為0<br>不存在的變量靖苇,初始化為0
1.寫入不存在或者不可見的成員變量時(shí),
__set()
方法班缰,兩個(gè)參數(shù),變量名和變量值(不可省略)
2.調(diào)用未定義或不可見的成員變量時(shí)悼枢,__get()
方法埠忘,一個(gè)參數(shù),變量名
魔術(shù)方法 __call()
class callobject{
public function mydream(){
echo '方法存在<br>';
}
public function __call($method,$parameter){
echo '不存在馒索,執(zhí)行__call方法<br>';
var_dump($parameter);
}
}
$exam=new callobject();
$exam->mydream();
//輸出:方法存在
$exam->hisdream('how','what','why');
//輸出:不存在莹妒,執(zhí)行__call方法 array(3) { [0]=> string(3) "how" [1]=> string(4) "what" [2]=> string(3) "why" }
__call()
方法存儲(chǔ)方法名及參數(shù)(調(diào)用不存在或者不可見的成員方法時(shí)),兩個(gè)參數(shù):方法名和方法參數(shù)(方法參數(shù)是以數(shù)組形式存在的)
魔術(shù)方法 __sleep() __wakeup()
1.__sleep() 方法常用于提交未提交的數(shù)據(jù),或類似的清理操作绰上。同時(shí)旨怠,如果有一些很大的對(duì)象,但不需要全部保存蜈块,這個(gè)功能就很好用鉴腻。
2.__wakeup() 經(jīng)常用在反序列化操作中迷扇,例如重新建立數(shù)據(jù)庫連接,或執(zhí)行其它初始化操作爽哎。
3.實(shí)現(xiàn)序列化接口的類將不再支持__sleep()
和__wakeup()
蜓席。
魔術(shù)方法 __toString()
class stringobject{
private $type='diy';
public function __toString(){
return $this->type;
}
}
$mycom=new stringobject();
echo '對(duì)象值為:'.$mycom;
//輸出:對(duì)象值為:diy
1.
__toString()
在echo print
輸出時(shí)將對(duì)象轉(zhuǎn)化成字符串
2.如果沒有__toString
直接輸出對(duì)象將發(fā)生致命錯(cuò)誤