導航:首頁 > 編程語言 > phpclassabstract

phpclassabstract

發布時間:2025-03-31 13:21:06

php和c,c++的區別是什麼

的區別:
一個有protected成員變數(假設為i)的類型Base,他的子類Derived直接繼承自Base,同時Derived有一個成員函數func,他的參數是Base類型的,這個函數可以訪問Base對象的protecte的成員嗎?在C++中不可以,而在PHP中可以。


關於重載:
PHP中不支持C++中的重載,重新定義個函數(不管是參數相同還是不同,都會導致重復定義錯誤)。PHP有自己的重載方法,而且比C++中的更廣泛,他不僅可以重載函數(通過使運散用__call()方法),還可以重載成員變數(通過使用__get()和__set())。而C++中只能對函數進行重載,而且重載的方法只有:不同的參數類型,不同的函數修飾符(const)。


關於abstract和interface
PHP中配悄余有這兩個修飾符,因為PHP不支持對一個普通類的多繼承,因此interface用於實現多繼承。Abstract類在C++中也存在,只是實現方培滾式不一樣,C++中使用pure virtual函數來表明這個類是抽象類,不能單獨被實例化。而PHP中不僅可以使用函數的修飾符abstract(另外class前也必須標明abstract)來標明這個意思,也可以只使用abstract修飾符修飾class更直接的表明他是抽象類。另外, C++中的pure virtual函數不受訪問類型的限制,不管是什麼訪問類型,都會被看作是public;而php中的abstract函數不能被聲明成private,僅此而已。


多態
因為PHP是弱類型語言,所以他的多態性到處都有體現,導致他的多態性不像C++中那麼明顯。比如,在PHP中基類的函數可以看作全是virtual的,因此它不需要加任何修飾符,子類中和基類同名的函數都會被動態調用,而C++不一樣,如果基類中的這個函數沒有加virtual修飾符,子類中的那個同名函數就不會被動態調用,只能靜態調用了。

操作符重載
PHP中不存在,而C++存在。重點在==操作符,在PHP中他可以運用在任何類型上,即使這個類型沒有(像C++中一樣)寫自己的==重載函數。PHP中對於對象的比較,==表示兩個對象的屬性和值都一樣,而且類型也一樣;PHP也存在一個===操作符,表示他們引用了同一個對象,這跟java中很像吧。


final關鍵字
PHP中存在這個關鍵字,表示這個函數不能被重寫(如果他用來修飾函數),或者類不能被繼承(如果用類修飾class)。而C++中沒有這個關鍵字,也無法模擬出那個效果。


對象賦值和拷貝
C++中的拷貝或者賦值大致有這三種方式。

一種是指針的賦值,即p1 = &obj,相當於PHP和java中的賦值操作;

另一種是memberwise assignment,也就是在obj1 = obj2時發生的事情,默認情況下執行淺度拷貝,和PHP中clone的效果一樣。他可以通過重載賦值拷貝操作來執行你的深度拷貝或者其他自定義的拷貝,這就相當於PHP中的__clone()成員函數;

第三種是memberwise initialization,也就是在參數傳遞時,傳遞返回值時或者包含對象的容器初始化的時候自動運行的,你可以通過自己定義拷貝構造函數來控制它的效果。

拷貝構造函數在PHP中幾乎用不到,因為他的傳遞是完全按引用傳遞,而不是對象的直接拷貝。

⑵ php反射在哪些場景有哪些作用

反射是在PHP運行狀態中,擴展分析PHP程序,導出或提取出關於類、方法、屬性、參數等的詳細信息,包括注釋。這種動態獲取的信息以及動態調用對象的方法的功能稱為反射API。反射是操縱面向對象范型中元模型的API,其功能十分強大,可幫助我們構建復雜,可擴展的應用。
其用途如:自動載入插件,自動生成文檔,甚至可用來擴充PHP語言。
php反射api由若干類組成,可幫助我們用來訪問程序的元數據或者同相關的注釋交互。藉助反射我們可以獲取諸如類實現了那些方法,創建一個類的實例(不同於用new創建),調用一個方法(也不同於常規調用),傳遞參數,動態調用類的靜態方法。
反射api是php內建的oop技術擴展,包括一些類,異常和介面,綜合使用他們可用來幫助我們分析其它類,介面,方法,屬性,方法和擴展。這些oop擴展被稱為反射。
通過ReflectionClass,我們可以得到Person類的以下信息:

1)常量 Contants
2)屬性 Property Names
3)方法 Method Names靜態
4)屬性 Static Properties
5)命名空間 Namespace
6)Person類是否為final或者abstract

然後就去看了看thinkphp的源碼,對於MVC的實現也有不同的體驗ThinkPHPLibCoreApp.class.php 中的exec方法

if(!preg_match('/^[A-Za-z](w)*$/',$action)){
//非法操作
thrownewReflectionException();
}
//執行當前操作
$method=newReflectionMethod($mole,$action);#查看方法
if($method->isPublic()){
$class=newReflectionClass($mole);#反射控制器
//前置操作
if($class->hasMethod('_before_'.$action)){
$before=$class->getMethod('_before_'.$action);
if($before->isPublic()){
$before->invoke($mole);
}
}
//URL參數綁定檢測
if(C('URL_PARAMS_BIND')&&$method->getNumberOfParameters()>0){
switch($_SERVER['REQUEST_METHOD']){
case'POST':
$vars=$_POST;
break;
case'PUT':
parse_str(file_get_contents('php://input'),$vars);
break;
default:
$vars=$_GET;
}
$params=$method->getParameters();
foreach($paramsas$param){
$name=$param->getName();
if(isset($vars[$name])){
$args[]=$vars[$name];
}elseif($param->isDefaultValueAvailable()){
$args[]=$param->getDefaultValue();
}else{
throw_exception(L('_PARAM_ERROR_').':'.$name);
}
}
$method->invokeArgs($mole,$args);
}else{
$method->invoke($mole);#執行我們需要調用函數
}
//後置操作
if($class->hasMethod('_after_'.$action)){
$after=$class->getMethod('_after_'.$action);
if($after->isPublic()){
$after->invoke($mole);
}
}

⑶ php中抽象類和介面的區別

區別:
1、對介面的使用是通過關鍵字implements。對抽象類的使用是通過關鍵字extends。當然介面也可以通過關鍵字extends繼承。
2、介面中不可以聲明成員變數(包括類靜態變數),但是可以聲明類常量。抽象類中可以聲明各種類型成員變數,實現數據的封裝。(另JAVA介面中的成員變數都要聲明為public static final類型)



<?phpabstract class Father { function meth1() { echo "meth1...<br>"; } abstract function meth2(); public $var1="var1"; public static $var2="var2"; const Var3="Var3";}class Son extends Father { function meth2() { echo "meth2 of Son...<br>"; }}$s=new Son();echo $s->var1."<br>";echo Father::$var2."<br>";echo Father::Var3."<br>";Interface IFather { //public $iVar1="iVar1"; 此處介面定義中不能包含成員變數 //public static $iVar2="iVar2"; 此處介面定義中不能包含靜態變數 const iVar3="iVar3"; function iMeth1();}Class ISon implements IFather { function iMeth1() { echo "iMeth1...<br>"; }}$is=new ISon();echo IFather::iVar3;?>

3、介面沒有構造函數,抽象類可以有構造函數。
4、介面中的方法默認都是public類型的,而抽象類中的方法可以使用private,protected,public來修飾。
5、一個類可以同時實現多個介面,但一個類只能繼承於一個抽象類。
抽象類還是介面
1. 如果要創建一個模型,這個模型將由一些緊密相關的對象採用,就可以使用抽象類。如果要創建將由一些不相關對象採用的功能,就使用介面。
2. 如果必須從多個來源繼承行為,就使用介面。
3. 如果知道所有類都會共享一個公共的行為實現,就使用抽象類,並在其中實現該行為。

閱讀全文

與phpclassabstract相關的資料

熱點內容
為什麼要編譯源代碼 瀏覽:819
輸入法freetype交叉編譯 瀏覽:436
電阻單片機代號 瀏覽:469
來畫app怎麼添加對話框 瀏覽:318
python序列化分布式 瀏覽:107
域名伺服器是什麼形式 瀏覽:681
rsa加密解密速度快 瀏覽:924
mac電腦如何單片機開發 瀏覽:547
紀念日app怎麼用小插件 瀏覽:331
如何更改安卓手機所在地區 瀏覽:217
程序員負債120萬 瀏覽:80
階層pdf 瀏覽:380
linuxgit安裝配置 瀏覽:319
用源碼搭建app要改什麼 瀏覽:42
密碼學教程pdf 瀏覽:3
亞馬遜做的加密貨幣 瀏覽:81
怎麼搭建雲播伺服器 瀏覽:867
網站客服機器人源碼 瀏覽:317
2021程序員的出路 瀏覽:547
發行與承銷pdf 瀏覽:945