溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

class類怎么在php中使用

發(fā)布時(shí)間:2021-01-05 15:27:27 來源:億速云 閱讀:237 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章給大家介紹class類怎么在php中使用,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

一:結(jié)構(gòu)和調(diào)用(實(shí)例化):

class className{} ,調(diào)用:$obj = new className();當(dāng)類有構(gòu)造函數(shù)時(shí),還應(yīng)傳入?yún)?shù)。如$obj = new className($v,$v2…);

二:構(gòu)造函數(shù)和析構(gòu)函數(shù):

1、構(gòu)造函數(shù)用于初始化:使用__construct(),可帶參數(shù)。

2、但析構(gòu)函數(shù)不能帶參數(shù)(用于在銷去一個(gè)類之前執(zhí)行一些操作或功能)。析構(gòu)函數(shù)用__destruct()做名稱。在腳本執(zhí)行結(jié)束時(shí),會(huì)銷掉內(nèi)存中的對(duì)象,因此可不用析造函數(shù),但有些比如COOKIE等,就應(yīng)當(dāng)要用此函數(shù)銷掉。

知識(shí)點(diǎn):在PHP4中也提供了構(gòu)造函數(shù),但使用的是與類同名的類方法,在PHP5仍能兼容這種做法,當(dāng)一個(gè)類中沒有包含__construct時(shí),會(huì)查找與類同名的方法,如果找到,就認(rèn)為是構(gòu)造函數(shù),如下:

復(fù)制代碼 代碼如下:


class test
{ var $b;
function test() { $this->b=5; }
function addab($c) { return $this->b+$c; }
}
$a = new test(); echo $a->addab(4); // 返回 9


3、PHP不會(huì)自動(dòng)調(diào)用父類的構(gòu)造函數(shù)(不支持構(gòu)造函數(shù)重載),必須使用parent關(guān)鍵字顯式地調(diào)用。

復(fù)制代碼 代碼如下:


class employee{
function __construct()….
}
class Manager extents Employee{
function __construct(){
parent::_construct();
echo ‘這個(gè)子類的父類構(gòu)造函數(shù)調(diào)用了!';
}
}


當(dāng)然也可以調(diào)用與該實(shí)例沒有任何關(guān)系的其它類的構(gòu)造函數(shù)。只需在__construct()前加上類名即可。如:
otherClassName::__construct();

類的主家庭成員:屬性、方法、常量、靜態(tài)成員

三、類的屬性:
有兩種方法對(duì)類的屬性賦值或取值。
1、使用公共作用域public關(guān)鍵詞。
2、使用__set()和__get()來分別賦值和取值,前者稱為設(shè)置方法(setter)或修改方法(mutator),后者稱為訪問方法(accessor)或獲取方法(getter)。建議使用這種方法:優(yōu)點(diǎn):
A、可在__set()統(tǒng)一進(jìn)行數(shù)據(jù)驗(yàn)證。
B、便于統(tǒng)一管理屬性。

注意:

第一:__set()和__get()只對(duì)私有屬性起作用,對(duì)于用public定義的屬性,它們兩個(gè)都懶理搭理,如下:

復(fù)制代碼 代碼如下:


class test{
protected $a=9,$b=2,$c;
public $d;
function __set($n,$v) { $this->$n = $v+2; }
function __get($name) { return $this->$name+2; }
}
$a = new test();
$a->b =5; echo “<br />”; echo $a->b;


實(shí)例只對(duì)$a,$b,$c的設(shè)置會(huì)經(jīng)過__set和__get過濾與返回,對(duì)于$d,就不會(huì)起作用。如$a->d=5,再返回還是5。

第二:__set($n,$v)要帶兩個(gè)參數(shù)。而__get($n)只能有一個(gè)參數(shù)。實(shí)例:

復(fù)制代碼 代碼如下:


class test{
private $a=5,$b=6,$c;
function __set($n,$v)
{
if($n=='a'&&$n>0)
$this->$n = $v;
else
$this->$n = $v+2;
}
function __get($name)
{
return $this->$name; //如果改為return $this->$name + $this->addab(); 如調(diào)用a的值,實(shí)際返回的是a+a+b的值。默認(rèn)為5+5+6=16。
}
function addab()
{ return $this->a + $this->b; }
}
$e=new test();
$e->a = 11; //注意寫法:類的內(nèi)部用$this->$n即變量的寫法,但外部實(shí)例要用$e->a的方式。
$e->b = 12; //get 14
$e->k = 22;


類的屬性可自由擴(kuò)展,如上例的k,不管是否用__set,當(dāng)一個(gè)實(shí)例建立起來后,可以用$e->newProperty = xx;直接來創(chuàng)造一個(gè)屬性,但不建議這么做。

四、類的方法:
理解成類當(dāng)中的函數(shù)即可。

調(diào)用:

1、內(nèi)部調(diào)用:可使用$this->Fanname();或$this->addab()或test::addab();

2、實(shí)例化調(diào)用時(shí),用$e->addab();即可。對(duì)于在該方法中沒有使用$this關(guān)鍵字的,如上例中的:
function addab() { return $this->a+$this->b; }
改為: function addab() { return 25; }那在在外部實(shí)例調(diào)用該方法,也可用“$e::addab();”或“test::addab();”

五、類的常量:
如果類的屬性理解成類中的變量,那么類的常量和變量是不一樣的,其定義方法為:

復(fù)制代碼 代碼如下:


class test{
private $a;
const PI = '3.14′;
…..
//在類中調(diào)用上面的常量用兩種方法,“$this::PI”,或 “類名::PI”,這里就是test::PI,如下:
function getvalue(){
return $this->a * $this::PI; //或$this->a * test::PI,用this關(guān)鍵字或類名均可,但都要用雙冒號(hào)。
}
}
$e= new test();
$e->PI =5; //注意,這里用 ->只是創(chuàng)造了一個(gè)也是名為PI的屬性,而不是改變類中的PI常量的值。
echo $e::PI; //這個(gè)才是調(diào)用類的常量。


常量只能用雙冒號(hào)::來調(diào)用。并且不能更改其值。
在類外部實(shí)例化后調(diào)用類常量同樣也有兩種方法。方法為:
“$e::PI” 或 “test::PI”,共同點(diǎn)是都要用冒號(hào),不同點(diǎn)是外部不能用this關(guān)鍵字,只能用實(shí)例名,但類名::PI是通用的。

六、類的靜態(tài)成員(靜態(tài)屬性或靜態(tài)方法):

如果需要?jiǎng)?chuàng)建供所有類的實(shí)例共享的字段或方法。就得用靜態(tài)成員。有兩個(gè)特征:

1、靜態(tài)成員是共產(chǎn)主義者,它讓腳本上的所有該類的實(shí)例調(diào)用,但不能借助類的特定實(shí)例名調(diào)用,而是在類的外部,統(tǒng)一使用“類名::$成員名”的方式調(diào)用。而類的內(nèi)部則統(tǒng)一使用 “self::$成員名”來調(diào)用。

2、當(dāng)每一次新創(chuàng)建實(shí)例時(shí),靜態(tài)成員會(huì)從上次創(chuàng)建的實(shí)例最后值開始重新計(jì)算,而不是類中初始的值開始計(jì)算。

3、對(duì)于用public定義的靜態(tài)成員,可以在外部更改它的值。private等則不行。

復(fù)制代碼 代碼如下:


class test{
public static $v = 0;
function __construct(){ self::$v++; }
static function getV(){ return self::$v; }
}
$a = new test();
echo test::getV(); // 返回 1
$b = new test();
echo test::getV(); // 返回 2
test::$v=8; //由于public定義的成員,改變靜態(tài)成員的值。
$c = new test();
echo test::getV(); // 返回 9


七、關(guān)鍵字:
(一)this關(guān)鍵字:用于類的內(nèi)部指代類的本身。來訪問屬性或方法或常量,如$this->屬性名或方法名。$this::常量名。this還可以用在該類的子類中,來指代本身的屬性或方法。

(二)雙冒號(hào)“::”關(guān)鍵字:用于調(diào)用常量、靜態(tài)成員。

(三)self關(guān)鍵字:在類的內(nèi)部與雙冒號(hào)配合調(diào)用靜態(tài)成員,如 self::$staticVar.,在類的內(nèi)部,不能用$this來調(diào)用靜態(tài)成員。

(四)__toString():在類中使用__toString(),用于將類轉(zhuǎn)成字串并打印類,用處不大:如:

復(fù)制代碼 代碼如下:


class test{ public $p;
public function __toString(){ return var_export($this,TRUE); }
}
$a=new test();
echo $a; //輸出:test::__set_state(array( ‘p' => NULL, )),或?qū)懗桑篹cho $a->__toString();


(五)__clone() :當(dāng)克隆對(duì)象時(shí),這個(gè)關(guān)鍵字才會(huì)發(fā)生作用,用于更改克隆時(shí)某些值。

(六)__call():方法重載,參下面示例:

復(fù)制代碼 代碼如下:


class cB{
function __call($method,$n){
if($method=='showVarType'){
if(is_numeric($n[0])){ //不能用$n。要用$n[0];
$this->displayNum();
}else if (is_array($n[0])){
$this->displayArr();
}else{
$this->displayOther();
}
}
}
function displayNum() {
echo ‘<h4>這是數(shù)字!</h4>';
}
function displayArr() {
echo ‘<h4>這是數(shù)組!</h4>';
}
function displayOther() {
echo ‘<h4>不是數(shù)組也不是數(shù)字!</h4>';
}
}

$x='a';
$y=array(‘a(chǎn)','b');
$b=new cB;
$b->showVarType($x); //不是數(shù)組也不是數(shù)字
$b->showVarType($y); //這是數(shù)組

注意,不能在類中定義showVarType()方法,否則代碼不能用。

(七)extends:繼承: 如class a{} class b extends a{} 類b繼承了類a

附:記憶:以后統(tǒng)一在調(diào)用方法或?qū)傩詴r(shí)用 “-> “,調(diào)用常量則用雙冒號(hào)“::”,不會(huì)搞暈。

八、方法和屬性的作用域:

共有6種:public(默認(rèn),可省略,也等同于php6的var聲明),private(私有,也不能由子類使用),protected(私有,但可由子類使用) ,abstract(抽象,參下文),final(阻止在子類中覆蓋—也稱重載,阻止被繼承,用于修飾類名及方法,如final class test{ final function fun(){}} ,但不能用于屬性),static(靜態(tài))

九:抽象類和抽象方法(abstract——注意:沒有所謂抽象屬性):

抽象可以理解成父類為子類定義了一個(gè)模板或基類。作用域abstract只在父類中聲明,但在子類中實(shí)現(xiàn)。注意事項(xiàng):

1、抽象類不能被實(shí)例化,只能被子類(具體類)繼承后實(shí)現(xiàn)。

2、抽象類必須在其子類中實(shí)現(xiàn)該抽象類的所有抽象方法。否則會(huì)出錯(cuò)。

3、在抽象方法中,只是聲明,但不能具體實(shí)現(xiàn):如abstract function gettow(){ return $this->p; }是錯(cuò)的,只能聲明這個(gè)方法:abstract function gettow();(連方括號(hào){}都不要出現(xiàn)),抽象方法和抽象類主要用于復(fù)雜的類層次關(guān)系中。該層次關(guān)系需要確保每一個(gè)子類都包含并重載了某些特定的方法。這也可以通過接口實(shí)現(xiàn)

4、屬性不能被命名為抽象屬性,如abstract $p = 5是錯(cuò)的。

5、只有聲明為抽象的類可以聲明抽象方法,但如果方法聲明為抽象,就不能具體實(shí)現(xiàn)。如:

復(fù)制代碼 代碼如下:


abstract class Employee
{
abstract function a(…);
abstract function b(…);
}


以后再對(duì)這個(gè)父類擴(kuò)展,組成各種子類(如經(jīng)理,員工,出納)。

6、抽象類中,如果要實(shí)現(xiàn)具體的方法,不能聲明為抽象。這樣可能實(shí)際意義更大??梢园褞讉€(gè)類庫(kù)中共同的部分提取到抽象類中,其它的類繼承抽象類即可。如下:

復(fù)制代碼 代碼如下:


abstract class BaseShop{
Const TAX=0.06; // 在抽象類中定義常量
public function buy($gid) { // 如果定義為抽象方法abstract function buy()就不能在這里實(shí)現(xiàn)主體。
echo(‘你購(gòu)買了ID為 :'.$gid.'的商品');
}
public function sell($gid) {
echo(‘你賣了ID為 :'.$gid.'的商品');
}
public function view($gid) {
echo(‘你查看了ID為 :'.$gid.'的商品');
}
}
class BallShop extends BaseShop{
var $itme_id = null;
public function __construct()
{
$this->itme_id = 2314;
}
public function open()
{
$this->sell($this->itme_id);
}
public function getTax()
{
echo printf(‘<h4>平均稅率是 %d%%。</h4>',$this::TAX*100);
}
}
$s = new BallShop;
$s->open(); //你賣了ID為 :2314的商品
$shop->getTax();


十:類型提示:
注意,類型提示功能只能用于參數(shù)為對(duì)象的提示,而無法用于為整數(shù),字串,浮點(diǎn)等類型提示。有些類的方法需要傳入的參數(shù)為所期望的對(duì)象類型,可以用下面的方法達(dá)到強(qiáng)制實(shí)施此替則。要達(dá)到類型提示,只要在方法的對(duì)象型參數(shù)前加一個(gè)已存在的類的名稱,如:function funname(OtherClassName $otherclassINSName,$c….),注意,OtherClassName必須是存在的類。如下:

復(fù)制代碼 代碼如下:


class em{ var $k=56; }
class test{
function __construct()
{ echo $this->addab(new em(),2); }

function addab(em $j,$c) //這個(gè)方法,即可以在內(nèi)部調(diào)用,也可以在外部調(diào)用。只要作用域許可。
{ return $j->k+$c; }
}
$a = new test();
$b = new em();
echo $a->addab($b,2); //或 $a->addab(new em(),2);

十一、類的管理:

1、instanceof關(guān)鍵字:用于分析一個(gè)對(duì)象是否是某一個(gè)類的實(shí)例或子類或是實(shí)現(xiàn)了某個(gè)特定的接口:如下例,但要注意: 類名沒有任何引號(hào)等定界符,否則會(huì)出錯(cuò)。如test不能用'test'

復(fù)制代碼 代碼如下:


class test2{}
class test{}
class testChilern Extends test{}
$a = new test2();
$m = new test();
$i = ($m instanceof test);
if($i)echo ‘$m是類test的實(shí)例!<br />'; // get this value
switch ($a instanceof test){
case true :
echo ‘YES<br />';
break;
case false :
echo ‘No<br />'; //get this value
break;
}
$d=new testChilern();
if($d instanceof test)echo ‘$d是類test的子類!<br />'; // get this value


2、確定類是否存在:boolean class_exists(string class_name): class_exists(‘test');

3、返回類名:string get_class(object),成功時(shí)返回實(shí)例的類名,失敗則返回FALSE:

$a = new test2(); echo get_class($a); //返回 test2

4、了解類的公用屬性:array get_class_vars(‘className') ,返回關(guān)鍵數(shù)組:包含所有定義的public屬性名及其相應(yīng)的值。這個(gè)函數(shù)不能用實(shí)例名做變量

5、返回類方法:get_class_methods(‘test'); //或: get_class_methods($a);可用實(shí)例名做參數(shù),返回包括構(gòu)造函數(shù)在內(nèi)的所有非私有方法。

6、print_r(get_declared_classes())了解當(dāng)前PHP版本中所有的類名。PHP5有149個(gè)。

7、get_object_vars($a)返回實(shí)例中所有公用的屬性及其值的關(guān)聯(lián)數(shù)組。注意它和get_class_vars()的區(qū)別:
/* (1) get_object_vars($a)是用實(shí)例名做參數(shù),而get_class_vars(‘test')是用類名做參數(shù)。
* (2) get_object_vars($a)獲得的屬性值是實(shí)例運(yùn)行后的值,而get_class_vars(‘test')獲得的屬性值是類中的初始定義。
* (3) 兩者均返回關(guān)聯(lián)數(shù)組,且均對(duì)未賦值的屬性返回NULL的值。如類test中有定義了public $q;則返回Array ( [v] => 5 [q]=>) ,
*/

8、返回父類的名稱:get_parent_class($b);//或get_parent_class(‘test2′); 返回test

9、確定接口是否存在:boolean interface_exists($string interface[,boolean autoload])

10、確定對(duì)象類型: boolean is_a($obj,'className'),當(dāng)$obj屬于CLASSNAME類時(shí),或?qū)儆谄渥宇悤r(shí),返回TRUE,如果$obj與class類型無關(guān)則返回FALSE。如:is_a($a,'test')

11、確定是否是某類的子對(duì)象:當(dāng)$b是繼承自TEST類時(shí),返回TRUE,否則FALSE。boolean is_subclass_of($b,'test');

12、確定類或?qū)嵗?,是否存在某方法。method_exists($a,'getv') //或用method_exists(‘test','getv'),此函數(shù)適用于非public定義的作用域的方法。

以上函數(shù)實(shí)例:

復(fù)制代碼 代碼如下:


class test{
public $v=2;
private $c=5;
function __construct(){
$this->v=5;
}
private function getv(){
return $this->v;
}
}
class test2 extends test{}

$a=new test();
$b=new test2();
print_r( get_class_methods(‘test')); //或:print_r( get_class_methods($a)); 均返回:Array ( [0] => __construct [1] => getv )
echo ‘<br />';
print_r( get_class_vars(‘test')); //返回:Array ( [v] => 2 ),和上面不一樣,不能用print_r( get_class_methods($a));
echo ‘<br />';
echo get_parent_class($b);//或get_parent_class(‘test2′); 返回test
echo ‘<br />';
echo is_a($b,'test');// 返回1
echo ‘<br />';
if(is_subclass_of(‘test2′,'test'))echo ‘是子類!'; //或(is_subclass_of($b,'test')),返回1,當(dāng)參數(shù)1為$a時(shí)則返回false,
echo ‘<br />';
echo method_exists($a,'getv') //或用method_exists(‘test','getv')返回1,本函數(shù)也適用于用private等定義域的方法。

十一、自動(dòng)加載類庫(kù)文件:

當(dāng)類多了以后,比如要在一個(gè)文件中載入3個(gè)類庫(kù)文件:a.class.php,b.class.php,c.class.php要用三個(gè)require_once(‘classes/a.class.php);

require_once(‘classes/b.class.php);
require_once(‘classes/c.class.php);

可以用PHP5自動(dòng)加載的功能來處理:在全局應(yīng)用配置文件中,定義一個(gè)特殊的函數(shù)__autoload($class)函數(shù)(__autoload并不是一個(gè)類的方法,只是單獨(dú)的函數(shù),和類沒有關(guān)系):
function __autoload($class){
require_once(“classes/$class)
}

該函數(shù)放哪沒有關(guān)系,在創(chuàng)建類實(shí)例時(shí),也不必去調(diào)用這個(gè)autoload函數(shù)。PHP會(huì)自動(dòng)完成。但務(wù)必注意一點(diǎn):“在調(diào)用頁面上創(chuàng)建實(shí)例所使用的類名稱”、和“被調(diào)用的文件名”、以及“該文件中的類的名稱”3個(gè)必須是一樣的。這樣就不需要去調(diào)用__autoload();如果不一樣則必須單獨(dú)調(diào)用__autoload(‘c');并給它一個(gè)文件名前綴。如:
c.class.php文件的代碼是:

復(fù)制代碼 代碼如下:


< ?php
class c{
public $m=7;
}
?>


這里代碼的類名稱是c,而文件名也是c,
現(xiàn)在要在index.php調(diào)用:

復(fù)制代碼 代碼如下:


< ?php
function __autoload($class){
require_once “$class.class.php”;
}

$m = new c(); //創(chuàng)建實(shí)例調(diào)用的類也是c
echo $m->m;
?>

此時(shí)PHP會(huì)自動(dòng)調(diào)用根目錄下的c.class.php中的類C。

但如果c.class.php中的代碼是:

復(fù)制代碼 代碼如下:


< ?php
class mm{
public $m=7;
}
?>


而調(diào)用頁index.php代碼是:

復(fù)制代碼 代碼如下:


< ?php
function __autoload($class){
require_once “$class.class.php”;
}
# __autoload(‘c'); //如果不加這一行就會(huì)出錯(cuò)。
$m = new mm();
echo $m->m;
?>


會(huì)出錯(cuò),提示找不到mm.class.php文件。這時(shí)可以加一行__autoload(‘c');但這樣就達(dá)不到簡(jiǎn)化代碼的目的。

類的家族化擴(kuò)展:類的高級(jí)功能:

一、對(duì)象克?。?br/>當(dāng)克隆一個(gè)對(duì)象的實(shí)例時(shí),其屬性初始值繼承了被克隆對(duì)象的當(dāng)前值。

復(fù)制代碼 代碼如下:


class test
{
public $p=5;
function __clone(){ //只在克隆發(fā)生時(shí)起作用。用于改變?cè)诳寺r(shí)某些值
$this->p=15;
}
}
$a=new test();
echo $a->p;
$a->p=8; //如果沒有__clone()方法影響,$b的P值將為8
$b = clone $a;
echo $b->p; //15


二、對(duì)象繼承:

沒有被聲明為final的類可以被繼承,沒有被final和private界定的方法也可以繼承,沒有被private界定的屬性也可以繼承。當(dāng)子類繼承了父類或超類后,可以直接使用父類或超類(祖父類以及祖父的祖父)的所有允許的方法,屬性。
關(guān)鍵:理解構(gòu)造函數(shù)和重載在繼承中的特性!

(一)構(gòu)造函數(shù)在繼承中的特性:

1、當(dāng)父類有構(gòu)造函數(shù)而子類沒有:則子類會(huì)在實(shí)例化時(shí)會(huì)自動(dòng)執(zhí)行父類的構(gòu)造函數(shù)。這時(shí)如果要?jiǎng)?chuàng)建子類的實(shí)例,需要引入父類構(gòu)造函數(shù)中所需的參數(shù),否則出錯(cuò)。即使是“子類的子類”如果沒有構(gòu)造函數(shù),也要在創(chuàng)建實(shí)例時(shí)輸入其父類的父類的構(gòu)造函數(shù)所需參數(shù)。PHP會(huì)從實(shí)例所在的子類會(huì)向上搜索合造的構(gòu)造函數(shù),一旦找到就停止,使用該構(gòu)造函數(shù)。而不會(huì)再向上搜索,因此:子類本身如果沒有構(gòu)造函數(shù),則以其最靠近的一個(gè)超類并且有構(gòu)造函數(shù)的為準(zhǔn)。

復(fù)制代碼 代碼如下:


class cA{
public $name,$age;
function __construct($n) {
$this->name = $n;
$this->age = 25;
}
function __set($n,$v) {
$this->$n = $v;
}
function __get($n) {
return $this->$n;
}
}

class cB extends cA{
function funB1() { echo ‘<h4>Class cB execute success!</h4>'; }
}

class cC extends cB {
function funC1() { echo ‘<h4>Class cC FunC1!</h4>'; }
}
$b=new cB(‘Jack');
$b->name='John';
echo “$b->name : $b->age”;
$b->funB1();
$c=new cC(); //這里會(huì)出錯(cuò),由于cB也沒有構(gòu)造函數(shù),因此再向上以cA為準(zhǔn),需要一個(gè)參數(shù)。改為$c=new cC(‘David');即可。
echo $c->name(); //David

2、當(dāng)子類也有構(gòu)造函數(shù)時(shí):這時(shí),不管父類是否有構(gòu)造函數(shù),都會(huì)執(zhí)行子類自己的構(gòu)造函數(shù)。
如上:

復(fù)制代碼 代碼如下:


class cB extends cA{
function __construct() {
echo ‘<h4>this is Class cB \'s __construct!</h4>';
}
function funB1() {
echo ‘<h4>Class cB execute success!</h4>';
}
}


現(xiàn)在類CB有自己的構(gòu)造函數(shù)時(shí),這時(shí)創(chuàng)建實(shí)例$b=new cB(‘Jack');參數(shù)JACK不會(huì)起作用,因?yàn)楦割怌A的構(gòu)造函數(shù)沒有得到執(zhí)行。因此$b->name和$->age就不會(huì)初始化值。需要另外賦值$b->name='Jack',$b->age=25;
如果這時(shí)要執(zhí)行父類CA的構(gòu)造函數(shù),可以這樣:

復(fù)制代碼 代碼如下:


function __construct($n) {
parent::__construct($n); // 或:cA::__construct($n);
echo ‘<h4>this is Class cB \'s __construct!</h4>';
}


由于parent::__construct($n); 只會(huì)向上搜索父類的構(gòu)造函數(shù),一找到就停止且執(zhí)行當(dāng)前找到的構(gòu)造函數(shù),因此在上面例子中,如果parent::__construct($n)是用在最后一層的類cC中,并且類CB,CA都有構(gòu)造函數(shù),那么cC的實(shí)例只會(huì)執(zhí)行cB的構(gòu)造函數(shù)。不會(huì)執(zhí)行cA。這時(shí),如果CC的實(shí)例想都調(diào)用CA和CB的構(gòu)造函數(shù),有兩種方法:

A、在CB中也加入parent::__construct($n)
B、在CC中把構(gòu)造函數(shù)改為:

復(fù)制代碼 代碼如下:


function __construct($n) {
cA::__construct($n); //即:類名::構(gòu)造函數(shù)。
cB::__construct();
echo ‘<h4>this is Class cB \'s __construct!</h4>';
}


(二)在子類中調(diào)用父類的屬性或方法:

1、調(diào)用父類方法:在子類中調(diào)用父類的方法,有3種方法:
$this->ParentFunction(); 或
父類名::ParentFunction(); 或
parent::parentFun();

2、調(diào)用父類屬性:只能用$this->ParentProperty;

(三)重載:

在子類中,可以定義與父類相同屬性或方法,改變父類該屬性或方法的值或操作,稱做重載。如:
calss ParClass{ function pfun(){ ….}}
class ChildrenClass extends ParClass{function pfun(){ ….}}} //重載了父類的pfun的方法。
在子類中重載后,優(yōu)先執(zhí)行自己重載后的新定義的方法或?qū)傩浴?br/>也可以在子類中用parent::parentFun();調(diào)用父類的方法,但所得到的值是子類自己輸入的參數(shù)運(yùn)算值。而不是該方法在父類中運(yùn)算的值。

三、接口:

接口:interface,可以理解成一組功能的共同規(guī)范,最大意義可能就是在多人協(xié)作時(shí),為各自的開發(fā)規(guī)定一個(gè)共同的方法名稱。

和抽象類中的抽象方法一樣:

1、不能在接口中對(duì)方法具體實(shí)現(xiàn)進(jìn)行定義。而是由具體類來實(shí)現(xiàn)(而抽象類中的非抽象方法可以不必再定義,只有抽象方法和接口是一樣要求要在具體類中實(shí)現(xiàn))。

2、和抽象類一樣,可以在接口中定義常量,并由具體類直接繼承。

3、具體類必須實(shí)現(xiàn)抽象類的所有抽象方法(非抽象方法除外),同樣,具體類如通過implements實(shí)現(xiàn)了接口后,必須完成接口中的所有方法。

接口實(shí)現(xiàn)過程:1、定義接口,2、用..implement X,Y,…和具體類對(duì)接。

復(fù)制代碼 代碼如下:


interface Info{ //定義接口
const N=22;
public function getage();
public function getname();
}

class age implements Info //如要多個(gè)接口 class age (extends emJob) implements Info,interB…
{
public $age=15;
public $name='Join';
function getage() {
echo “年級(jí)是$this->age”;
}
function getname() {
echo “姓名是$this->name”;
}
function getN(){
echo ‘<h4>在接口中定義的常量N的值是:'.$this::N.' </h4>'; //直接繼承接口中的常量值。
}
}

$age=new age;
echo $age::N; //22,直接調(diào)用接口中的常量值。
$age->getN();

關(guān)于抽象類和接口類的使用區(qū)分:何時(shí)用接口,何時(shí)用抽象?

1、相關(guān)性:當(dāng)創(chuàng)建的模型由一些緊密相關(guān)的對(duì)象采用時(shí),用抽象。對(duì)于不相關(guān)對(duì)象采用的功能,用接口。

2、多重繼承:PHP類可以繼承多個(gè)接口,但不能擴(kuò)展多個(gè)抽象類。

3、公共行為實(shí)現(xiàn):抽象類可在其中實(shí)現(xiàn)公共的方法,但接口不行。

四、命名空間(PHP6)

類庫(kù)腳本A.inc.php和腳本B.inc.php中都一個(gè)類的名稱為 class CNAME,并且這兩個(gè)文件要在同一個(gè)文件如index.php中被調(diào)用。這時(shí)要用到命名空間。

步聚:

1、打開上面的A和B兩個(gè)文件,分別在上面的最前面各加一行:

namespace SPACEA; 和 namespace SPACEB; 名字自定。

2、在index.php中實(shí)例化類時(shí),在類的前面添加命名空間和雙冒號(hào)做為前綴:
include ‘a(chǎn).inc.php';
include ‘b.inc.php';
$a=new SPACEA::CNAME();
$b=new SPACEB::CNAME();

關(guān)于class類怎么在php中使用就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI