chengren-成人-php系列3
2010年最新PHP類(lèi)的精縮歸納
chengren-成人-php系列3
?
十:類(lèi)型提示:
注意,類(lèi)型提示功能只能用于參數(shù)為對(duì)象的提示,而無(wú)法用于為整數(shù),字串,浮點(diǎn)等類(lèi)型提示。有些類(lèi)的方法需要傳入的參數(shù)為所期望的對(duì)象類(lèi)型,可以用下面的方法達(dá)到強(qiáng)制實(shí)施此替則。要達(dá)到類(lèi)型提示,只要在方法的對(duì)象型參數(shù)前加一個(gè)已存在的類(lèi)的名稱(chēng),如:function funname(OtherClassName $otherclassINSName,$c....),注意,OtherClassName必須是存在的類(lèi)。如下:
| 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); |
十一、類(lèi)的管理:
1、instanceof關(guān)鍵字:用于分析一個(gè)對(duì)象是否是某一個(gè)類(lèi)的實(shí)例或子類(lèi)或是實(shí)現(xiàn)了某個(gè)特定的接口:如下例,但要注意: 類(lèi)名沒(méi)有任何引號(hào)等定界符,否則會(huì)出錯(cuò)。如test不能用'test'
| class test2{} class test{} class testChilern Extends test{} $a = new test2(); $m = new test(); $i = ($m instanceof test); if($i)echo '$m是類(lèi)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是類(lèi)test的子類(lèi)!<br />'; // get this value |
2、確定類(lèi)是否存在:boolean class_exists(string class_name): class_exists('test');
3、返回類(lèi)名:string get_class(object),成功時(shí)返回實(shí)例的類(lèi)名,失敗則返回FALSE:
| $a = new test2(); echo get_class($a); //返回 test2 |
4、了解類(lèi)的公用屬性:array get_class_vars('className') ,返回關(guān)鍵數(shù)組:包含所有定義的public屬性名及其相應(yīng)的值。這個(gè)函數(shù)不能用實(shí)例名做變量
5、返回類(lèi)方法:get_class_methods('test'); //或: get_class_methods($a);可用實(shí)例名做參數(shù),返回包括構(gòu)造函數(shù)在內(nèi)的所有非私有方法。
6、print_r(get_declared_classes())了解當(dāng)前PHP版本中所有的類(lèi)名。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')是用類(lèi)名做參數(shù)。 * (2) get_object_vars($a)獲得的屬性值是實(shí)例運(yùn)行后的值,而get_class_vars('test')獲得的屬性值是類(lèi)中的初始定義。 * (3) 兩者均返回關(guān)聯(lián)數(shù)組,且均對(duì)未賦值的屬性返回NULL的值。如類(lèi)test中有定義了public $q;則返回Array ( [v] => 5 [q]=>) , */ |
8、返回父類(lèi)的名稱(chēng):get_parent_class($b);//或get_parent_class('test2'); 返回test
9、確定接口是否存在:boolean interface_exists($string interface[,boolean autoload])
10、確定對(duì)象類(lèi)型: boolean is_a($obj,'className'),當(dāng)$obj屬于CLASSNAME類(lèi)時(shí),或?qū)儆谄渥宇?lèi)時(shí),返回TRUE,如果$obj與class類(lèi)型無(wú)關(guān)則返回FALSE。如:is_a($a,'test')
11、確定是否是某類(lèi)的子對(duì)象:當(dāng)$b是繼承自TEST類(lèi)時(shí),返回TRUE,否則FALSE。boolean is_subclass_of($b,'test');
12、確定類(lèi)或?qū)嵗?#xff0c;是否存在某方法。method_exists($a,'getv') //或用method_exists('test','getv'),此函數(shù)適用于非public定義的作用域的方法。
以上函數(shù)實(shí)例:
| 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 '是子類(lèi)!'; //或(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)加載類(lèi)庫(kù)文件:
當(dāng)類(lèi)多了以后,比如要在一個(gè)文件中載入3個(gè)類(lèi)庫(kù)文件:a.class.php,b.class.php,c.class.php要用三個(gè)require_once
| require_once('classes/a.class.php); require_once('classes/b.class.php); require_once('classes/c.class.php); |
可以用PHP5自動(dòng)加載的功能來(lái)處理:在全局應(yīng)用配置文件中,定義一個(gè)特殊的函數(shù)__autoload($class)函數(shù)(__autoload并不是一個(gè)類(lèi)的方法,只是單獨(dú)的函數(shù),和類(lèi)沒(méi)有關(guān)系):
| function __autoload($class){ require_once("classes/$class) } |
該函數(shù)放哪沒(méi)有關(guān)系,在創(chuàng)建類(lèi)實(shí)例時(shí),也不必去調(diào)用這個(gè)autoload函數(shù)。PHP會(huì)自動(dòng)完成。但務(wù)必注意一點(diǎn):“在調(diào)用頁(yè)面上創(chuàng)建實(shí)例所使用的類(lèi)名稱(chēng)”、和“被調(diào)用的文件名”、以及“該文件中的類(lèi)的名稱(chēng)”3個(gè)必須是一樣的。這樣就不需要去調(diào)用__autoload();如果不一樣則必須單獨(dú)調(diào)用__autoload('c');并給它一個(gè)文件名前綴。如:
c.class.php文件的代碼是:
| <?php class c{ public $m=7; } ?>這里代碼的類(lèi)名稱(chēng)是c,而文件名也是c, 現(xiàn)在要在index.php調(diào)用: <?php function __autoload($class){ require_once "$class.class.php"; } $m = new c(); //創(chuàng)建實(shí)例調(diào)用的類(lèi)也是c echo $m->m; ?> |
此時(shí)PHP會(huì)自動(dòng)調(diào)用根目錄下的c.class.php中的類(lèi)C。
但如果c.class.php中的代碼是:
| <?php class mm{ public $m=7; } ?> 而調(diào)用頁(yè)index.php代碼是: <?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)化代碼的目的。
轉(zhuǎn)載于:https://www.cnblogs.com/chengren/archive/2010/03/30/1700386.html
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的chengren-成人-php系列3的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何取消网商银行
- 下一篇: 创业还是打工 现阶段一定要深思熟虑