詳談PHP面向?qū)ο笾谐S玫年P(guān)鍵字和魔術(shù)方法
PHP面向?qū)ο笾谐S玫年P(guān)鍵字
final
1.final不能修飾成員屬性(類中常量不是用這個(gè)關(guān)鍵字)
2.final只能修飾類和方法
作用:
使用final修飾的類不能被子類繼承
使用final修飾的方法不能被子類覆蓋
用來限制類不被繼承,方法不被覆蓋就使用final
<?php //final修飾的類不能被繼承 final class Person{ var $name; var $age; var $sex; function __construct($name,$age,$sex){ $this->name=$name; $this->age=$age; $this->sex=$sex; } function fun1(){ echo $this->name; } } //Student類繼承類用final修飾的Person類,所以會(huì)報(bào)錯(cuò) class Student extends Person{ } $stu=new Student("zs",20,"nan"); $stu->fun1(); ?>
static(靜態(tài)關(guān)鍵字)
1.使用static可以修飾成員屬性和成員方法,不能修飾類
2.用static修飾的成員屬性,可以被同一個(gè)類的所有對(duì)象共享
3.靜態(tài)的數(shù)據(jù)是存在內(nèi)存中的數(shù)據(jù)段中(初始化靜態(tài)段)
4.靜態(tài)的數(shù)據(jù)是在類被第一次加載時(shí)分配到內(nèi)存中的,以后再用到類時(shí)就直接從數(shù)據(jù)段中獲取
5.什么是類被加載?只要在程序中使用到這個(gè)類(有這個(gè)類名出現(xiàn))
6.靜態(tài)方法(static修飾的方法),不能訪問非靜態(tài)的成員(在非靜態(tài)方法中可以訪問靜態(tài)成員)
因?yàn)榉庆o態(tài)的成員,就必須用對(duì)象來訪問,訪問內(nèi)部成員使用的就是$this,而靜態(tài)方法不用使用對(duì)象調(diào)用,也就沒有對(duì)象,$this也就不能代表對(duì)象,非靜態(tài)的成員還必須使用對(duì)象
如果你確定一個(gè)方法中不使用非靜態(tài)成員,則可以將這個(gè)方法聲明為即靜態(tài)方法
注意:靜態(tài)的成員都要使用類名去訪問,不要?jiǎng)?chuàng)建對(duì)象,不用對(duì)象訪問
類名::靜態(tài)成員
如果在類中使用靜態(tài)成員,可以使用self代表本類
const
1.它只能修飾成員屬性
2.類中聲明常量屬性使用const
3.訪問方式和static靜態(tài)成員屬性一樣(在類外部使用 類名::常量 在類內(nèi)部使用 self::常量)
4.常量一定要在聲明的時(shí)候就給初值
<?php //定義一個(gè)類“人們” class Person{ protected $name; protected $age; protected $sex; static $country="中國"; //聲明一個(gè)常量 const RUN="走"; //構(gòu)造方法 function __construct($name,$age,$sex){ $this->name=$name; $this->age=$age; $this->sex=$sex; } function getCountry(){ //如果在類中使用靜態(tài)成員,可以使用self代表本類 return self::$country; } function say(){ echo "我的名字:{$this->name},我的年齡:{$this->age},我的性別:{$this->sex}。<br>"; } protected function eat(){ echo "吃飯!<br>"; } function run(){ //在類的內(nèi)部使用常量 self::常量 echo self::RUN."<br>"; } //聲明靜態(tài)的方法 static function hello(){ echo "你好<br>"; } }
PHP面向?qū)ο笾谐S玫哪g(shù)方法
__call()
作用:調(diào)用對(duì)象中不存在的方法時(shí),就會(huì)出現(xiàn)系統(tǒng)報(bào)錯(cuò),然后程序退出。
什么時(shí)候自動(dòng)調(diào)用:就會(huì)在調(diào)用一個(gè)對(duì)象中不存在的方法時(shí)就會(huì)自動(dòng)調(diào)用
處理一些不存在的錯(cuò)誤調(diào)用
這個(gè)方法需要兩個(gè)參數(shù)
<?php //定義一個(gè)類“人們” class Person{ protected $name; protected $age; protected $sex; static $country="中國"; //聲明一個(gè)常量 const RUN="走"; //構(gòu)造方法 function __construct($name,$age,$sex){ $this->name=$name; $this->age=$age; $this->sex=$sex; } function getCountry(){ //如果在類中使用靜態(tài)成員,可以使用self代表本類 return self::$country; } function say(){ echo "我的名字:{$this->name},我的年齡:{$this->age},我的性別:{$this->sex}。<br>"; } protected function eat(){ echo "吃飯!<br>"; } function run(){ //在類的內(nèi)部使用常量 self::常量 echo self::RUN."<br>"; } //處理一些不存在的錯(cuò)誤調(diào)用 //就會(huì)在調(diào)用一個(gè)對(duì)象中不存在的方法時(shí)就會(huì)自動(dòng)調(diào)用 function __call($methodName,$args){ //$methodName調(diào)用不存在方法的方法名 $args里面的參數(shù) echo "你調(diào)用的方法{$methodName}(參數(shù):"; print_r($args); echo ")不存在<br>"; } //聲明靜態(tài)的方法 static function hello(){ echo "你好<br>"; } } $p=new Person("張三",20,"女"); $p->test(10,20,30); $p->demo("aa","bb"); $p->say(); ?>
__toString()
直接輸出對(duì)象引用的時(shí)候自動(dòng)調(diào)用,用來快速獲取字符串表示的最快捷的方法
<?php //定義一個(gè)類“人們” class Person{ protected $name; protected $age; protected $sex; static $country="中國"; //聲明一個(gè)常量 const RUN="走"; //構(gòu)造方法 function __construct($name,$age,$sex){ $this->name=$name; $this->age=$age; $this->sex=$sex; } function say(){ echo "我的名字:{$this->name},我的年齡:{$this->age},我的性別:{$this->sex}。<br>"; } function __toString(){ return self::$country."<br>{$this->name}<br>{$this->age}<br>{$this->sex}<br>".self::RUN; } } $p=new Person("張三",21,"女"); echo $p; ?>
__clone()
克隆對(duì)象使用clone()處理
原本(原來的對(duì)象)
復(fù)本(復(fù)制出來的對(duì)象)
__clone()就是在克隆對(duì)象時(shí)自動(dòng)調(diào)用的方法
只要一個(gè)對(duì)象一創(chuàng)建,就要有初始化的動(dòng)作,和構(gòu)造方法__constuct作用相似
在__clone()方法中的$this關(guān)鍵字代表的是復(fù)本的對(duì)象,$that代表原本對(duì)象
<?php //定義一個(gè)類“人們” class Person{ var $name; protected $age; protected $sex; static $country="中國"; //聲明一個(gè)常量 const RUN="走"; //構(gòu)造方法 function __construct($name,$age,$sex){ $this->name=$name; $this->age=$age; $this->sex=$sex; } function say(){ echo "我的名字:{$this->name},我的年齡:{$this->age},我的性別:{$this->sex}。<br>"; } function __clone(){ $this->name="王五"; $this->age=18; $this->sex="男"; } function __destruct(){ echo $this->name."<br>"; } } $p=new Person("張三",21,"女"); $p->say(); //這并不能叫做克隆對(duì)象,因?yàn)樵谖鰳?gòu)時(shí)只析構(gòu)一次 /*$p1=$p; $p1->name="李四"; $p1->say();*/ $p1= clone $p; $p1->say(); ?>
__autoload()
注意:其它的魔術(shù)方法都是在類中添加起作用,這是唯一一個(gè)不在類中添加的方法
只要在頁面中使用到一個(gè)類,只要用到類名,就會(huì)自動(dòng)將這個(gè)類名傳給這個(gè)參數(shù)
<?php function __autoload($className){ include "./test/".$className.".class.php"; } $o=new One; $o->fun1(); $t=new Two; $t->fun2(); $h=new Three; $h->fun3(); ?>
test里的文件
one.class.php
<?php class One{ function fun1(){ echo "The Class One<br>"; } } ?>
two.class.php
<?php class Two{ function fun2(){ echo "The Class Two<br>"; } } ?>
three.class.php
<?php class Three{ function fun3(){ echo "The Class Three<br>"; } } ?>
對(duì)象串行化(序列化):將一個(gè)對(duì)象轉(zhuǎn)為二進(jìn)制串(對(duì)象是存儲(chǔ)在內(nèi)存中的,容易釋放)
使用時(shí)間:
1.將對(duì)象長時(shí)間存儲(chǔ)在數(shù)據(jù)庫或文件中時(shí)
2.將對(duì)象在多個(gè)PHP文件中傳輸時(shí)
serialize(); 參數(shù)是一個(gè)對(duì)象,返回來的就是串行化后的二進(jìn)制串
unserialize(); 參數(shù)就是對(duì)象的二進(jìn)制串,返回來的就是新生成的對(duì)象
__sleep()
是在序列化時(shí)調(diào)用的方法
作用:就是可以將一個(gè)對(duì)象部分串行化
只要這個(gè)方法中返回一個(gè)數(shù)組,數(shù)組中有幾個(gè)成員屬性就序列化幾個(gè)成員屬性,如果不加這個(gè)方法,則所有成員都被序列化
__wakeup()
是在反序列化時(shí)調(diào)用的方法
也是對(duì)象重新誕生的過程
<?php //定義一個(gè)類“人們” class Person{ var $name; protected $age; protected $sex; static $country="中國"; //聲明一個(gè)常量 const RUN="走"; //構(gòu)造方法 function __construct($name,$age,$sex){ $this->name=$name; $this->age=$age; $this->sex=$sex; } function say(){ echo "我的名字:{$this->name},我的年齡:{$this->age},我的性別:{$this->sex}。<br>"; } function __clone(){ $this->name="王五"; $this->age=18; $this->sex="男"; } //是在序列化時(shí)調(diào)用的方法,可以部分串行化對(duì)象 function __sleep(){ return array("name","age"); } //是在反序列化時(shí)調(diào)用的方法,也是對(duì)象重新誕生的過程??梢愿淖兝锩娴闹? function __wakeup(){ $this->name="sanzhang"; $this->age=$this->age+1; } function __destruct(){ } } ?>
read.php
<?php require "11.php"; $str=file_get_contents("mess.txt"); $p=unserialize($str); echo $p->say(); ?>
write.php
<?php require "11.php"; $p=new Person("張三",18,"男"); $str=serialize($p); file_put_contents("mess.txt",$str); ?>
以上這篇詳談PHP面向?qū)ο笾谐S玫年P(guān)鍵字和魔術(shù)方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
php實(shí)現(xiàn)保存submit內(nèi)容之后禁止刷新
這篇文章主要介紹了php保存submit內(nèi)容之后禁止刷新的具體實(shí)現(xiàn),需要的朋友可以參考下2014-03-03PHP中構(gòu)造函數(shù)和析構(gòu)函數(shù)解析
這篇文章主要介紹了PHP中構(gòu)造函數(shù)和析構(gòu)函數(shù)解析,本文用代碼實(shí)例講解了PHP中構(gòu)造函數(shù)和析構(gòu)函數(shù),需要的朋友可以參考下2014-10-10php可擴(kuò)展的驗(yàn)證類實(shí)例(可對(duì)郵件、手機(jī)號(hào)、URL等驗(yàn)證)
這篇文章主要介紹了php可擴(kuò)展的驗(yàn)證類,實(shí)例分析了php針對(duì)郵件、手機(jī)號(hào)、URL等常用的驗(yàn)證技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-07-07