詳談PHP中public,private,protected,abstract等關(guān)鍵字的用法
PHP中常用的關(guān)鍵字
在PHP中包含了很多對(duì)函數(shù)和類(lèi)進(jìn)行限制的關(guān)鍵字,常用的通常有abstract,final,interface,public,protected,private,static等等,下面我們就將對(duì)這些進(jìn)行分析整理各個(gè)的用法。
變量與方法的關(guān)鍵字public,private,protected
public的權(quán)限最大,既可以讓子類(lèi)使用,也可以支持實(shí)例化之后的調(diào)用,
protected表示的是受保護(hù)的,訪(fǎng)問(wèn)的權(quán)限是只有在子類(lèi)和本類(lèi)中才可以被訪(fǎng)問(wèn)到
private 表示的是私有,只能夠是在當(dāng)前的類(lèi)中可以被訪(fǎng)問(wèn)到
<?php // /** * Define MyClass */ class MyClass { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; public function printHello() { echo $this->public; echo $this->protected; echo $this->private; } protected function pro_test(){ var_dump(1); } } $obj = new MyClass(); echo $obj->public; // 這行能被正常執(zhí)行 //echo $obj->protected; // 這行會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤 //echo $obj->private; // 這行也會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤 $obj->printHello(); // 輸出 Public、Protected 和 Private $obj->pro_test();//直接報(bào)錯(cuò) ?>
變量與方法的關(guān)鍵字static
static的作用就是能夠?qū)崿F(xiàn)值或者方法在類(lèi)中不需實(shí)例化的情況下調(diào)用,同時(shí)static修飾的變量具有與值存儲(chǔ)的功能,例如我們不使用static運(yùn)行的結(jié)果如下:
<?php function test(){ $var=1; echo $var."</br>"; $var++; } test();// 1 test();// 1 test();// 1 ?>
如果我們給變量加上static那么就會(huì)變成這樣
<?php function test(){ static $var=1; echo $var."</br>"; $var++; } test();// 1 test();// 2 test();// 3 ?>
這里可能不能夠體會(huì)到PHP這樣做的好處,那么我們就先來(lái)假設(shè)一下讀者也熟悉JS,在JS中是沒(méi)有static這個(gè)關(guān)鍵字的,所以如果我們要來(lái)實(shí)現(xiàn)一個(gè)具有能夠保存每一次程序運(yùn)算結(jié)果作為下一次運(yùn)算的依據(jù)的一個(gè)程序我們需要這樣來(lái)寫(xiě)。
var glo=0; function test(){ glo++; document.writeln(glo); } test(); test(); test();
這樣就會(huì)把glo泄漏到全局變量中,如果生成的變量比較多,就會(huì)導(dǎo)致內(nèi)存泄露(內(nèi)存泄漏所指代的就是變量占用過(guò)多的內(nèi)存空間沒(méi)有別釋放)
<script> var glo=0; function test(){ glo++; document.writeln(glo); } test();// 1 test();// 2 test();// 3 </script>
所以相比于在沒(méi)有定義static的語(yǔ)言中,它具有一個(gè)優(yōu)勢(shì)是保持變量,不泄露內(nèi)存,也不容易導(dǎo)致全局變量被誤用(因?yàn)樽饔糜虿辉谌郑?/p>
$age=0; $age++; function test1() { static $age = 100; $age++; echo $age."</br>"; } function test2() { static $age = 1000; $age++; echo $age."</br>"; } test1(); // 101 test2(); // 1001
class與方法的關(guān)鍵字final
final只能夠用來(lái)修飾class與function,使用了final之后就不能夠被繼承,例如如下的代碼就會(huì)直接報(bào)錯(cuò)
class BaseClass { public $public = 'Public'; function test() { echo "BaseClass::test() called\n"; } final public function moreTesting() { echo "BaseClass::moreTesting() called\n"; } } class ChildClass extends BaseClass { public function moreTesting() { echo "ChildClass::moreTesting() called\n"; } }
特殊關(guān)鍵字interface,abstract
interface的意義在于規(guī)范編程的風(fēng)格,設(shè)想一下就是如果是實(shí)現(xiàn)了一個(gè)接口那么我們?cè)谑褂眠@個(gè)接口類(lèi)的時(shí)候就必須要實(shí)現(xiàn)里面的方法,起到了統(tǒng)一命名的作用。
class是可以多繼承接口的,接口與接口之間的單繼承是通過(guò)extends來(lái)實(shí)現(xiàn)的,class與接口之間的關(guān)系確立是通過(guò)implements
示例代碼:
<?php interface testA{ function funcA(); } interface testB{ function funcB(); } interface testC extends testA { function funcC(); } class run implements testC ,testB { public function funcA() { // TODO: Implement funcA() method. } public function funcB() { // TODO: Implement funcB() method. } public function funcC() { // TODO: Implement funcC() method. } } ?>
abstract的作用跟interface其實(shí)是一樣的,但是在interface中所有的方法都是必須要實(shí)現(xiàn)的,但是在abstract修飾的類(lèi)中,可以有一個(gè)或者是多個(gè)的abstract修飾方法,所以我們可以這樣理解,interface就是abstract的一種特殊情況(當(dāng)所有的方法都是抽象方法,都是必須要實(shí)現(xiàn)的)。abstract有以下的這些特征:
1. 只要類(lèi)中有至少一個(gè)方法使用了abstract關(guān)鍵字,那么這個(gè)類(lèi)是abstract,要加上相應(yīng)的關(guān)鍵字
2. 抽象方法,只有方法的聲明部分,沒(méi)有方法體。
但是在我看來(lái),abstract在實(shí)際的應(yīng)用中有這樣的幾種場(chǎng)景
1. 多人編程的時(shí)候規(guī)范公共部分的命名規(guī)則(不做任何說(shuō)明,原理跟interface一樣)
2. 實(shí)現(xiàn)不讓父級(jí)直接實(shí)例化使用
樣式代碼如下:
<?php abstract class shopping { public function buy() { echo "buy"; } public function loan() { echo "loan"; } } class leslieBuy extends shopping { } //$test1=new shopping;//直接語(yǔ)法錯(cuò)誤 $leslieSie = new leslieBuy; $leslieSie->loan();//打印出loan ?>
以上這篇詳談PHP中public,private,protected,abstract等關(guān)鍵字的用法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- PHP abstract與interface之間的區(qū)別
- 深入解讀php中關(guān)于抽象(abstract)類(lèi)和抽象方法的問(wèn)題分析
- PHP abstract 抽象類(lèi)定義與用法示例
- PHP 抽象方法與抽象類(lèi)abstract關(guān)鍵字介紹及應(yīng)用
- PHP 面向?qū)ο?final類(lèi)與final方法
- php類(lèi)中的$this,static,final,const,self這幾個(gè)關(guān)鍵字使用方法
- PHP面向?qū)ο蟮倪M(jìn)階學(xué)習(xí)(抽像類(lèi)、接口、final、類(lèi)常量)
- php中final關(guān)鍵字用法分析
- php中static靜態(tài)變量的使用方法詳解
- php面向?qū)ο笾衧tatic靜態(tài)屬性和靜態(tài)方法的調(diào)用
- PHP中的靜態(tài)變量及static靜態(tài)變量使用詳解
- PHP中abstract(抽象)、final(最終)和static(靜態(tài))原理與用法詳解
相關(guān)文章
laravel實(shí)現(xiàn)Auth認(rèn)證,登錄、注冊(cè)后的頁(yè)面回跳方法
今天小編就為大家分享一篇laravel實(shí)現(xiàn)Auth認(rèn)證,登錄、注冊(cè)后的頁(yè)面回跳方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09php解析xml 的四種簡(jiǎn)單方法(附實(shí)例)
下面小編就為大家?guī)?lái)一篇php解析xml 的四種簡(jiǎn)單方法(附實(shí)例)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07ThinkPhP+Apache+PHPstorm整合框架流程圖解
這篇文章主要介紹了ThinkPhP+Apache+PHPstorm整合框架流程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Laravel框架實(shí)現(xiàn)多個(gè)視圖共享相同數(shù)據(jù)的方法詳解
這篇文章主要介紹了Laravel框架實(shí)現(xiàn)多個(gè)視圖共享相同數(shù)據(jù)的方法,涉及Laravel框架視圖與控制器數(shù)據(jù)調(diào)用相關(guān)操作技巧,需要的朋友可以參考下2019-07-07基于PHP+jQuery+MySql實(shí)現(xiàn)紅藍(lán)(頂踩)投票代碼
當(dāng)雙方意見(jiàn)不統(tǒng)一的情況下,需要用投票達(dá)成協(xié)議,本文通過(guò)實(shí)例給大家介紹基于PHP+jQuery+MySql實(shí)現(xiàn)紅藍(lán)(頂踩)投票代碼,需要的朋友可以參考下2015-08-08thinkPHP+ajax實(shí)現(xiàn)統(tǒng)計(jì)頁(yè)面pv瀏覽量的方法
這篇文章主要介紹了thinkPHP+ajax實(shí)現(xiàn)統(tǒng)計(jì)頁(yè)面pv瀏覽量的方法,涉及thinkPHP模板調(diào)用及數(shù)據(jù)庫(kù)讀寫(xiě)相關(guān)操作技巧,需要的朋友可以參考下2017-03-03PHP中使用三元條件運(yùn)算符一些例子和場(chǎng)景
這篇文章主要介紹了PHP中使用三元條件運(yùn)算符一些例子和場(chǎng)景,三元條件運(yùn)算符是PHP中用于根據(jù)條件表達(dá)式的結(jié)果來(lái)選擇兩個(gè)值中的一個(gè)的緊湊語(yǔ)法,基本形式為:條件???表達(dá)式1?:?表達(dá)式2,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09