chengren-成人-php系列3
2010年最新PHP类的精缩归纳
chengren-成人-php系列3
十:类型提示:
注意,类型提示功能只能用于参数为对象的提示,而无法用于为整数,字串,浮点等类型提示。有些类的方法需要传入的参数为所期望的对象类型,可以用下面的方法达到强制实施此替则。要达到类型提示,只要在方法的对象型参数前加一个已存在的类的名称,如:function funname(OtherClassName $otherclassINSName,$c....),注意,OtherClassName必须是存在的类。如下:
class em{ var $k=56; } class test{ function __construct() { echo $this->addab(new em(),2); } function addab(em $j,$c) //这个方法,即可以在内部调用,也可以在外部调用。只要作用域许可。 { return $j->k+$c; } } $a = new test(); $b = new em(); echo $a->addab($b,2); //或 $a->addab(new em(),2); |
十一、类的管理:
1、instanceof关键字:用于分析一个对象是否是某一个类的实例或子类或是实现了某个特定的接口:如下例,但要注意: 类名没有任何引号等定界符,否则会出错。如test不能用'test'
class test2{} class test{} class testChilern Extends test{} $a = new test2(); $m = new test(); $i = ($m instanceof test); if($i)echo '$m是类test的实例!<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),成功时返回实例的类名,失败则返回FALSE:
$a = new test2(); echo get_class($a); //返回 test2 |
4、了解类的公用属性:array get_class_vars('className') ,返回关键数组:包含所有定义的public属性名及其相应的值。这个函数不能用实例名做变量
5、返回类方法:get_class_methods('test'); //或: get_class_methods($a);可用实例名做参数,返回包括构造函数在内的所有非私有方法。
6、print_r(get_declared_classes())了解当前PHP版本中所有的类名。PHP5有149个。
7、get_object_vars($a)返回实例中所有公用的属性及其值的关联数组。注意它和get_class_vars()的区别:
/* (1) get_object_vars($a)是用实例名做参数,而get_class_vars('test')是用类名做参数。 * (2) get_object_vars($a)获得的属性值是实例运行后的值,而get_class_vars('test')获得的属性值是类中的初始定义。 * (3) 两者均返回关联数组,且均对未赋值的属性返回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、确定对象类型: boolean is_a($obj,'className'),当$obj属于CLASSNAME类时,或属于其子类时,返回TRUE,如果$obj与class类型无关则返回FALSE。如:is_a($a,'test')
11、确定是否是某类的子对象:当$b是继承自TEST类时,返回TRUE,否则FALSE。boolean is_subclass_of($b,'test');
12、确定类或实例中,是否存在某方法。method_exists($a,'getv') //或用method_exists('test','getv'),此函数适用于非public定义的作用域的方法。
以上函数实例:
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,当参数1为$a时则返回false, echo '<br />'; echo method_exists($a,'getv') //或用method_exists('test','getv')返回1,本函数也适用于用private等定义域的方法。 |
十一、自动加载类库文件:
当类多了以后,比如要在一个文件中载入3个类库文件:a.class.php,b.class.php,c.class.php要用三个require_once
require_once('classes/a.class.php); require_once('classes/b.class.php); require_once('classes/c.class.php); |
可以用PHP5自动加载的功能来处理:在全局应用配置文件中,定义一个特殊的函数__autoload($class)函数(__autoload并不是一个类的方法,只是单独的函数,和类没有关系):
function __autoload($class){ require_once("classes/$class) } |
该函数放哪没有关系,在创建类实例时,也不必去调用这个autoload函数。PHP会自动完成。但务必注意一点:“在调用页面上创建实例所使用的类名称”、和“被调用的文件名”、以及“该文件中的类的名称”3个必须是一样的。这样就不需要去调用__autoload();如果不一样则必须单独调用__autoload('c');并给它一个文件名前缀。如:
c.class.php文件的代码是:
<?php class c{ public $m=7; } ?>这里代码的类名称是c,而文件名也是c, 现在要在index.php调用: <?php function __autoload($class){ require_once "$class.class.php"; } $m = new c(); //创建实例调用的类也是c echo $m->m; ?> |
此时PHP会自动调用根目录下的c.class.php中的类C。
但如果c.class.php中的代码是:
<?php class mm{ public $m=7; } ?> 而调用页index.php代码是: <?php function __autoload($class){ require_once "$class.class.php"; } # __autoload('c'); //如果不加这一行就会出错。 $m = new mm(); echo $m->m; ?> |
会出错,提示找不到mm.class.php文件。这时可以加一行__autoload('c');但这样就达不到简化代码的目的。